web-dev-qa-db-fra.com

Comment obtenir le statut "Invoke-Expression", réussi ou échoué?

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?

9
vik santata

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

16
Mathias R. Jessen

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?

9
Ruts

$ 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
0
theosophe74