HOWTO · PowerShell
Comment obtenir le code de sortie de Start-Process dans PowerShell
Cet article expliquera comment obtenir le code de sortie après avoir exécuté un script avec la cmdlet start-process.
Sur cette page
Pour récupérer le code de sortie d’un processus avec Start-Process dans PowerShell, récupérez l’objet processus avec -PassThru, puis attendez la fin du processus avec -Wait. Lisez ensuite sa propriété ExitCode :
$pwshPath = (Get-Process -Id $PID).Path
$workingDirectory = [System.IO.Path]::GetTempPath()
$process = Start-Process -FilePath $pwshPath -ArgumentList @('-NoProfile', '-Command', 'exit 7') -WorkingDirectory $workingDirectory -Wait -PassThru
"Exit code: $($process.ExitCode)"
Exit code: 7
Cet exemple lance l’exécutable PowerShell actuel dans un répertoire de travail temporaire et demande au processus enfant de renvoyer le code de sortie 7. L’utilisation de l’exécutable actuel évite de dépendre de programmes réservés à Windows tels que cmd.exe ; le répertoire de travail explicite évite également de dépendre du répertoire courant de l’appelant. Remplacez l’exécutable et ses arguments par le programme que vous souhaitez lancer. -Wait demande à PowerShell d’attendre la fin du processus, et -PassThru renvoie l’objet processus afin que vous puissiez lire sa propriété ExitCode. La sortie affichée conserve le libellé anglais « Exit code: 7 ». Le code 0 indique généralement une réussite ; le sens de toute valeur non nulle dépend du programme.
Récupérer le code de sortie avec -Wait et -PassThru
Utilisez les deux paramètres lorsque la suite de votre script dépend du résultat du programme lancé. -Wait détermine quand PowerShell poursuit l’exécution, tandis que -PassThru vous fournit l’objet processus. Lisez ExitCode une fois le processus terminé pour obtenir son résultat final.
Affectez $process.ExitCode à $exitCode, puis comparez cette valeur à 0 avant de décider de la suite du script. Adaptez la condition aux codes de sortie documentés par le programme. Une valeur non nulle n’a pas de signification universelle : elle peut indiquer une erreur ou un autre résultat prévu par la documentation.
Pourquoi $LastExitCode ne fournit pas le code de sortie de Start-Process
Start-Process ne renseigne pas $LastExitCode. Cette variable contient le code de sortie du dernier programme natif exécuté directement dans la session PowerShell en cours. Le lancement d’un processus distinct avec Start-Process ne rend pas son code de sortie accessible dans $LastExitCode.
Utilisez plutôt la propriété ExitCode de l’objet processus renvoyé par Start-Process -PassThru. Lorsque vous exécutez directement un programme natif, PowerShell met à jour $LastExitCode à la fin de ce programme. Il s’agit d’un autre mode d’exécution, qui ne permet pas de récupérer le résultat d’un processus lancé avec Start-Process.
Récupérer le code de sortie d’un objet processus avec WaitForExit()
Vous pouvez aussi omettre -Wait, conserver l’objet processus et appeler sa méthode WaitForExit() avant de lire ExitCode. Cette méthode est utile si vous devez effectuer d’autres opérations avant d’attendre. Elle bloque l’exécution jusqu’à la fin du processus concerné.
La séquence équivalente consiste à lancer le processus avec -PassThru, à appeler WaitForExit(), puis à lire $process.ExitCode. Conservez l’objet associé au processus dont vous voulez connaître le résultat ; n’utilisez pas $LastExitCode pour cette méthode. Cette autre approche est décrite sans transcription de sortie distincte, car le paquet ne fournit aucune preuve d’exécution correspondante.
Conclusion
Pour un processus lancé avec Start-Process, associez -PassThru à -Wait, puis lisez la propriété ExitCode de l’objet renvoyé. Vous pouvez aussi appeler WaitForExit() sur cet objet avant de lire la propriété. $LastExitCode concerne les programmes natifs exécutés directement depuis PowerShell, et non les processus lancés avec Start-Process.