2

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 check $LastExitCode. 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

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
JamesThomasMoon
  • 4,639
  • 6
  • 33
  • 42
  • Can't you place the code in a Try Catch block and then simply exit? – Mark Kram Sep 16 '19 at 00:31
  • @MarkKram a `try ... catch` would require many lines of code. I was looking for a one-line statement that would set the powershell script mode, similar to bash `set -e`. – JamesThomasMoon Sep 16 '19 at 01:11

1 Answers1

7

Unfortunately, as of PowerShell Core 7.0.0-preview.3, PowerShell offers no way to automatically exit a script when an external program reports a nonzero exit code.

  • Adding support is being discussed in this RFC proposal.

  • 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 now, 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.

mklement0
  • 312,089
  • 56
  • 508
  • 622