如果发生错误,阻止运行下一个脚本

cil*_*ler 0 powershell

如果上一个脚本出现错误,如何阻止下一个脚本运行?

脚本

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)";
Run Code Online (Sandbox Code Playgroud)

更新

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

zet*_*t42 5

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

脚本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 
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为&&|| 管道链运算符使用$?$LASTEXITCODE变量来确定故障。

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