How to stop a PowerShell script on the first error?

后端 未结 8 1780
长情又很酷
长情又很酷 2020-12-02 06:11

I want my PowerShell script to stop when any of the commands I run fail (like set -e in bash). I\'m using both Powershell commands (New-Object System.Net.

8条回答
  •  死守一世寂寞
    2020-12-02 06:41

    You need slightly different error handling for powershell functions and for calling exe's, and you need to be sure to tell the caller of your script that it has failed. Building on top of Exec from the library Psake, a script that has the structure below will stop on all errors, and is usable as a base template for most scripts.

    Set-StrictMode -Version latest
    $ErrorActionPreference = "Stop"
    
    
    # Taken from psake https://github.com/psake/psake
    <#
    .SYNOPSIS
      This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode
      to see if an error occcured. If an error is detected then an exception is thrown.
      This function allows you to run command-line programs without having to
      explicitly check the $lastexitcode variable.
    .EXAMPLE
      exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"
    #>
    function Exec
    {
        [CmdletBinding()]
        param(
            [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
            [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ("Error executing command {0}" -f $cmd)
        )
        & $cmd
        if ($lastexitcode -ne 0) {
            throw ("Exec: " + $errorMessage)
        }
    }
    
    Try {
    
        # Put all your stuff inside here!
    
        # powershell functions called as normal and try..catch reports errors 
        New-Object System.Net.WebClient
    
        # call exe's and check their exit code using Exec
        Exec { setup.exe }
    
    } Catch {
        # tell the caller it has all gone wrong
        $host.SetShouldExit(-1)
        throw
    }
    

提交回复
热议问题