web-dev-qa-db-fra.com

Comment attraper la valeur de retour dans un script Powershell

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?

7
gtx911

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 $resultsera 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.

13
TToni