HOWTO · PowerShell
Wie man den Exit-Code von Start-Process in PowerShell erhält
Dieser Artikel erklärt, wie man den Exit-Code nach dem Ausführen eines Skripts mit dem Cmdlet Start-Process erhält.
Auf dieser Seite
Um den Exitcode eines mit PowerShell Start-Process gestarteten Prozesses abzurufen, erfassen Sie das Prozessobjekt mit -PassThru und warten Sie mit -Wait, bis der Prozess beendet ist. Lesen Sie anschließend dessen Eigenschaft 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
Dieses Beispiel startet die aktuelle PowerShell ausführbare Datei in einem temporären Arbeitsverzeichnis und weist den untergeordneten Prozess an, den Exitcode 7 zurückzugeben. Da die aktuelle ausführbare Datei verwendet wird, ist das Beispiel nicht von Windows-Programmen wie cmd.exe abhängig. Das ausdrücklich angegebene Arbeitsverzeichnis verhindert außerdem, dass das Beispiel vom aktuellen Verzeichnis des Aufrufers abhängt. Ersetzen Sie die ausführbare Datei und die Argumente durch das gewünschte Programm. -Wait lässt PowerShell auf den Abschluss warten, und -PassThru gibt das Prozessobjekt zurück, sodass dessen ExitCode gelesen werden kann. Die unverändert übernommene Beispielausgabe zeigt Exit code: 7; diese Beschriftung bleibt englisch. Der Exitcode 0 steht üblicherweise für Erfolg. Welche Bedeutung ein Wert ungleich null hat, legt das jeweilige Programm fest.
Exitcode mit -Wait und -PassThru abrufen
Verwenden Sie beide Parameter, wenn der nächste Teil Ihres Skripts vom Ergebnis des gestarteten Programms abhängt. -Wait bestimmt, wann PowerShell fortfährt, während -PassThru das Prozessobjekt bereitstellt. Lesen Sie ExitCode, nachdem der Prozess beendet wurde, um sein Endergebnis zu erhalten.
Weisen Sie $process.ExitCode der Variablen $exitCode zu und vergleichen Sie den Wert mit 0, bevor Sie festlegen, wie Ihr Skript fortfahren soll. Richten Sie die Bedingung nach den dokumentierten Exitcodes des jeweiligen Programms aus. Ein Wert ungleich null hat keine allgemeingültige Bedeutung: Er kann einen Fehler oder ein anderes dokumentiertes Ergebnis anzeigen.
Warum $LastExitCode keinen Start-Process-Exitcode meldet
Start-Process setzt $LastExitCode nicht. Die Variable enthält den Exitcode des zuletzt ausgeführten nativen Programms, das direkt in der aktuellen PowerShell-Sitzung gestartet wurde. Wenn Sie mit Start-Process einen separaten Prozess starten, wird dessen Exitcode daher nicht über $LastExitCode verfügbar.
Verwenden Sie stattdessen die Eigenschaft ExitCode des Prozessobjekts, das Start-Process -PassThru zurückgibt. Starten Sie ein natives Programm direkt, aktualisiert PowerShell $LastExitCode, sobald das Programm beendet ist. Das ist ein anderer Aufrufweg und ruft nicht das Ergebnis eines mit Start-Process gestarteten Prozesses ab.
Exitcode über ein Prozessobjekt mit WaitForExit() abrufen
Sie können -Wait auch weglassen, das Prozessobjekt behalten und dessen Methode WaitForExit() aufrufen, bevor Sie ExitCode lesen. Das ist nützlich, wenn Sie vor dem Warten noch andere Aufgaben erledigen müssen. Die Methode blockiert, bis der betreffende Prozess beendet ist.
Die entsprechende Abfolge lautet: Prozess mit -PassThru starten, WaitForExit() aufrufen und anschließend $process.ExitCode lesen. Behalten Sie das Prozessobjekt des Prozesses, dessen Ergebnis Sie benötigen; verwenden Sie für diesen Ablauf nicht $LastExitCode. Für diese Alternative liegt kein eigener Ausgabemitschnitt vor, da das Paket keinen Ausführungsnachweis dafür enthält.
Fazit
Kombinieren Sie für einen mit Start-Process gestarteten Prozess -PassThru und -Wait, und lesen Sie die Eigenschaft ExitCode des zurückgegebenen Objekts. Alternativ können Sie WaitForExit() für dieses Objekt aufrufen und anschließend die Eigenschaft lesen. $LastExitCode gilt für native Programme, die direkt aus PowerShell gestartet werden, nicht für einen über Start-Process gestarteten Prozess.