Invoke-Expression
renverra tout le texte de la commande appelée.
Mais comment puis-je obtenir la valeur de retour du système indiquant si cette commande a été exécutée avec succès ou en cas d'échec? Dans CMD, je pourrais utiliser %errorlevel%
pour obtenir l'état d'exécution des commandes externes. Qu'en est-il de PowerShell?
Normalement, vous utiliseriez $?
pour inspecter le statut de la dernière instruction exécutée:
PS C:\> Write-Output 123 | Out-Null; $?
True
PS C:\> Non-ExistingCmdlet 123 | Out-Null; $?
False
Cependant, cela ne fonctionnera pas avec Invoke-Expression
, car même si une instruction dans l'expression passée à Invoke-Expression
peut échouer, l'appel de Invoke-Expression
lui-même aura réussi (c.-à-d. L'expression, bien que non valide/non fonctionnel ait été invoqué néanmoins)
Avec Invoke-Expression
, vous devrez utiliser essayez:
try {
Invoke-Expression "Do-ErrorProneAction -Parameter $argument"
} catch {
# error handling go here, $_ contains the error record
}
ou un piège:
trap {
# error handling goes here, $_ contains the error record
}
Invoke-Expression "More-ErrorProneActions"
L'alternative est l'ajout ";$?"
à l'expression que vous voulez appeler:
$Expr = "Write-Host $SomeValue"
$Expr += ';$?'
$Success = Invoke-Expression $Expr
if(-not $Success){
# seems to have failed
}
mais repose sur l'absence de sortie de pipeline
Dans PowerShell, vous pouvez évaluer le statut d'exécution en inspectant les variables automatiques
$?
Contains True if last operation succeeded and False otherwise.
et/ou
$LASTEXITCODE
Contains the exit code of the last Win32 executable execution.
La première concerne les cmdlets PowerShell, la dernière les commandes externes (telles que %errorlevel%
dans les scripts de traitement par lots).
Est-ce que cela vous aide?
$ LASTEXITCODE ne peut pas être utilisé avec Invoke-Expression, car il sera nul, que l'expression invoquée réussisse ou échoue:
PS C:\Users\myUserAccount> touch temp.txt
PS C:\Users\myUserAccount> Invoke-Expression "Remove-Item .\temp.txt"
PS C:\Users\myUserAccount> echo $LASTEXITCODE
0
PS C:\Users\myUserAccount> Invoke-Expression "Remove-Item .\temp.txt"
Remove-Item : Cannot find path 'C:\Users\myUserAccount\temp.txt' because it does not
exist.
At line:1 char:1
+ Remove-Item .\temp.txt
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\myUserAccount\temp.txt:String) [Remove-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
PS C:\Users\myUserAccount> echo $LASTEXITCODE
0