415 Stimmen

Wie kann ein PowerShell-Skript beim ersten Fehler angehalten werden?

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 ).

16voto

Peter L Punkte 2472

Ich bin neu in der Powershell, aber dies scheint am effektivsten zu sein:

doSomething -arg myArg
if (-not $?) {throw "Failed to doSomething"}

7voto

Nasreddine Galfout Punkte 2472

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

5voto

nicolas-van Punkte 829

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 }

2voto

harvey263 Punkte 76

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}

2voto

Jarekczek Punkte 6930

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X