Ich möchte, dass mein PowerShell-Skript anhält, wenn einer der von mir ausgeführten Befehle fehlschlägt (wie set -e
in der Bash). Ich verwende beide Powershell-Befehle ( New-Object System.Net.WebClient
) und Programme ( .\setup.exe
).
Antworten
Zu viele Anzeigen?Für Leute, die hier auf 2021 kommen, ist dies meine Lösung, die sowohl Cmdlets als auch Programme umfasst
function CheckLastExitCode {
param ([int[]]$SuccessCodes = @(0))
if (!$?) {
Write-Host "Last CMD failed" -ForegroundColor Red
#GoToWrapperDirectory in my code I go back to the original directory that launched the script
exit
}
if ($SuccessCodes -notcontains $LastExitCode) {
Write-Host "EXE RETURNED EXIT CODE $LastExitCode" -ForegroundColor Red
#GoToWrapperDirectory in my code I go back to the original directory that launched the script
exit
}
}
Sie können es wie folgt verwenden
cd NonExistingpath
CheckLastExitCode
Soweit ich weiß, verfügt Powershell über keine automatische Behandlung von Exit-Codes ungleich Null, die von aufgerufenen Unterprogrammen zurückgegeben werden.
Die einzige Lösung, die ich bisher kenne, um das Verhalten von bash -e
ist es, diese Prüfung nach jede Aufruf eines externen Befehls:
if(!$?) { Exit $LASTEXITCODE }
Ich bin hierher gekommen, um das Gleiche zu suchen. $ErrorActionPreference="Stop" beendet meine Shell sofort, obwohl ich lieber die Fehlermeldung (Pause) sehen würde, bevor sie beendet wird. Ich greife auf meine Batch-Sensibilität zurück:
IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF
Ich habe festgestellt, dass dies für mein spezielles ps1-Skript ziemlich genau so funktioniert:
Import-PSSession $Session
If ($? -ne "True") {Pause; Exit}
Es scheint, als ob ein einfaches Zurückwerfen den Trick ausmacht.
param ([string] $Path, [string] $Find, [string] $Replace)
try {
((Get-Content -path $Path -Raw) -replace $Find, $Replace) | Set-Content -Path $Path
Write-Output Completed.
} catch {
# Without try/catch block errors don't interrupt program flow.
throw
}
Jetzt ausgeben Abgeschlossen erscheint erst nach erfolgreicher Ausführung.