Bonsoir à tous,
Je suis un débutant en PowerShell, et bien que déjà initié au scripting sous Linux (bash/perl), les conventions de scripts sysadmin Windows me sont totalement inconnues... c'est pourquoi je souhaiterais avoir quelques critiques (constructives) sur ce petit exemple
(il s'agit de compiler un mémoire en latex avec conversion des eps en pdf histoire d'avoir un pdf utilisable au lieu de la bouse issue de dvips puis ps2pdf... au final l'objectif est de reconstruire un make complet sous forme de DSL)
je n'aime pas du tout mon utilisation excessive de Invoke-Expression, si vous aviez des méthodes propres pour faire un style de Invoke-Command $commande @args
la "bibliothèque de fonctions"
le script
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Function Check-Command { Param( [parameter(Position=0,Mandatory=$true)][string] $Command, [parameter(Mandatory=$false)][System.Management.Automation.ActionPreference] $ErrAction = [System.Management.Automation.ActionPreference]::Inquire ) Return (Get-Command -CommandType Application -ErrorAction $ErrAction $Command).Definition } Function Replace-Extension { Param( [Parameter(Mandatory=$true,Position=0)][string] $FileName, [Parameter(Mandatory=$true,Position=1)][string] $FinalExtension ) $InitialExtension = [regex]::Replace($FileName, "(.+)\.([^\.]+)$", '$2') Return (($FileName) -Replace "$InitialExtension$", $FinalExtension) } Function Check-Location { Param( [Parameter(Mandatory=$true,Position=0)][string] $CurrentLocation, [Parameter(Mandatory=$true,Position=1)][string] $FilePath ) $Location = Split-Path $FilePath If ($CurrentLocation -ne $Location) { Set-Location $Location Return $Location } Return $CurrentLocation } Function Check-MustBeUpdated { Param( [Parameter(Mandatory=$true,Position=0)][string] $ExistingLocation, [Parameter(Mandatory=$true,Position=1)][string] $NewLocation, [Parameter(Mandatory=$true,Position=2)] $Test ) If (Test-Path $NewLocation) { If (& $Test $ExistingLocation (Get-Item $NewLocation)) { Return $false } } Return $true } Function Keep-Location ($code) { Push-Location & $code Pop-Location }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Param( # Programmes externes [parameter(Mandatory=$false)][string] $ExecLatex = 'pdflatex', [parameter(Mandatory=$false)][string] $ExecBibtex = 'bibtex', [parameter(Mandatory=$false)][string] $Converter = 'epstopdf', # Paramètres [parameter(Mandatory=$false)][string] $ImgRoot = 'images', [parameter(Mandatory=$false)][string] $Filter = '*.eps', [parameter(Mandatory=$false)][string] $FinalExtension = 'pdf', [parameter(Mandatory=$false)][string] $MainLatex = 'memoire', [parameter(Mandatory=$false)][string] $LatexOptions = ' -quiet -halt-on-error -disable-installer ' ) . .\my_utils.ps1 ######################################################################## ForEach ($prg in $ExecLatex,$ExecBibtex,$Converter) { Check-Command $prg } $cmdLatex = "$ExecLatex $LatexOptions '$MainLatex'" $cmdBibtex = "$ExecBibtex '$MainLatex'" Keep-Location { $currentDir = $ImgRoot $test = { Param($old,$new) Return ($new.LastWriteTime -gt $old.LastWriteTime) } ForEach ($img in (Get-ChildItem $ImgRoot -Recurse -Include $Filter)) { $currentDir = Check-Location $currentDir $img $pdfName = Replace-Extension ($img.Name) $FinalExtension If (Check-MustBeUpdated $img $pdfName $test) { Invoke-Expression ($Converter + ' ' + ($img.Name)) } } } Invoke-Expression $cmdLatex -ErrorAction Stop Invoke-Expression $cmdBibtex -ErrorAction Stop Invoke-Expression $cmdLatex -ErrorAction Stop Invoke-Expression $cmdLatex -ErrorAction Stop
par avance
Partager