JamesThomasMoon
JamesThomasMoon

Reputation: 7164

powershell script stops if program fails (like bash `set -o errexit`)

Is there an elegant Powershell script setting that would exit the running Powershell script (or shell instance) if a program fails?

I'm imagining something like Bash feature set -o errexit (or set -e) but for Powershell. In that feature, if a program in the bash script fails (process return code was not 0) then the bash shell instance immediately exits.

In powershell, the script could expliclty check $LastExitCode or $? (if($?){exit}). However, that becomes cumbersome to do for every program call. Maybe powershell has a feature to automatically check and react to program return codes?

To explain in a script

Using made-up idiom Set-Powershell-Auto-Exit

Set-Powershell-Auto-Exit "ProgramReturnCode"  # what should this be?
& "program.exe" --fail  # this program fails with an error code
& "foo.exe"             # this never runs because script has exited

Upvotes: 4

Views: 1463

Answers (2)

mklement0
mklement0

Reputation: 440679

Unfortunately, as of PowerShell (Core) 7.3.x, PowerShell offers no way to automatically exit a script when an external program reports a nonzero exit code.

For PowerShell-native commands only (cmdlets, scripts, functions), $ErrorActionPreference = 'Stop' can be used, which results in exit code 1.

  • If you need more control over what exit code is reported, see this answer.

  • For an overview of how PowerShell reports exit codes to the outside world, see this answer.

For external programs, you must test for $LASTEXITCODE -eq 0 explicitly and take action based on that, but as a workaround you can use a helper function for all external-program invocations, as shown in this answer.

Upvotes: 10

Daniel T
Daniel T

Reputation: 1191

As of PowerShell 7.3.0 preview, there is an experimental implementation for exiting scripts when external programs fail. The new RFC PR has moved to another link.

# Global config setup
Enable-ExperimentalFeature PSNativeCommandErrorActionPreference
exit
# Per-script setup
$ErrorActionPreference = 'Stop'
$PSNativeCommandUseErrorActionPreference = $true

# Code from original question
& {
    & program.exe --fail  # this program fails with an error code
    & foo.exe             # this never runs because script has exited
}

Upvotes: 2

Related Questions