Reputation: 7164
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?
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
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.
PSNativeCommandErrorActionPreference
is available in v7.3 and preview versions of v7.4, which, if the $PSNativeCommandArgumentPassing
preference variable is set to $true
, emits a PowerShell error in response to an external program's nonzero exit code, which is therefore subject to the value of the $ErrorActionPreference
preference variable; caveat:
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
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