J'ai un script Powershell (.ps1) qui exécute un autre script Powershell qui a une valeur de retour.
J'invoque le script avec cette commande:
$result = Invoke-Expression -Command ".\check.ps1 $fileCommon"
Write-Output $result
La sortie n'est que le Write-Ouput
qui ont l'autre script mais pas la valeur de retour qui est $true
ou $false
.
Comment puis-je attraper le retour de l'autre script?
L'expression derrière une instruction return
dans PowerShell est évaluée comme toutes les autres expressions. S'il produit une sortie, il est écrit sur stdout. Votre résultat $ reçoit tout ce qui est écrit sur stdout par le script. Si plus d'une chose est écrite dans stdout, vous obtenez ces choses dans un tableau.
Donc, si votre check.ps1 par exemple ressemble à ceci:
Write-Output "$args[0]"
return $false
et vous l'appelez avec
$result = &".\check.ps1" xxx
puis $result
sera un tableau d'objets de taille 2 avec les valeurs "xxx" (chaîne) et "False" (bool).
Si vous ne pouvez pas modifier le script de telle sorte qu'il n'écrit que la valeur de retour dans stdout (ce qui serait le moyen le plus propre), vous pouvez ignorer tout sauf la dernière valeur:
$result = &".\check.ps1" xxx | select -Last 1
À présent $result
ne contiendra que "False" comme valeur booléenne.
Si vous pouvez changer le script, une autre option serait de passer un nom de variable et de le définir dans le script.
Appel:
&".\check.ps1" $fileCommon "result"
if ($result) {
# Do things
}
Scénario:
param($file,$parentvariable)
# Do things
Set-Variable -Name $parentvariable -Value $false -Scope 1
Le -Scope 1
fait référence à la portée parent (appelant), vous pouvez donc simplement la lire à partir du code appelant.