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"
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
}
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
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