首页 > 解决方案 > 如果发生错误,阻止运行下一个脚本

问题描述

如果前一个脚本出错,如何防止下一个脚本运行?

脚本

RUNME.ps1: |
        write-Host "Script:" $PSCommandPath;
        write-Host "Path:" $PSScriptRoot;
        write-Host "=====";
        & "$PSScriptRoot/script1.ps1" &&
        & "$PSScriptRoot/script2.ps1" &&
        & "$PSScriptRoot/script3.ps1";

SCRIPT1.ps1: |
        write-host "Hello from Script1" &&
        write-host "Version $($psversiontable.PSVersion)";

SCRIPT2.ps1: |
        write-host "Hello from Script2" &&
        Get-Date -Format ss | %{if ($_ % 2 -eq 0) { write-error "$_ even" } else {write-host "$_ odd" }}

SCRIPT3.ps1: |
        write-host "Hello from Script3" ||
        write-host "Version $($psversiontable.PSVersion)";

更新

根据@zett42 的回答,我必须更新Script2以涵盖该场景。因此,如果 Script2 失败,我不希望 Script3 运行。

标签: powershell

解决方案


一种可能的方法是通过报告错误的脚本设置一个不同于零的退出代码:

脚本2.ps1:

$errCount = $error.Count

write-host "Hello from Script2" &&
Get-Date -Format ss | %{if ($_ % 2 -eq 0) { write-error "$_ even" } else {write-host "$_ odd" }}

# If there are new errors, exit script with an exit code that indicates error    
if( $error.Count -gt $errCount ) { 
    exit 1 
}

这是有效的,因为&&and|| 管道链操作员使用$?and$LASTEXITCODE变量来确定失败。

假定$ErrorActionPreference未设置为Stop。如果是Stop,则报告错误的第一个命令将导致脚本终止错误,过早退出脚本(在达到if条件之前)并跳过所有后续脚本。


推荐阅读