当使用调用运算符出现非零退出代码时,为什么 PowerShell 脚本不会结束?

问题描述 投票:0回答:4

为什么在使用调用运算符和

$ErrorActionPerference = "Stop"
时出现非零退出代码时 PowerShell 脚本不会结束?

使用以下示例,我得到结果

managed to get here with exit code 1

$ErrorActionPreference = "Stop"

& cmd.exe /c "exit 1"

Write-Host "managed to get here with exit code $LASTEXITCODE"

呼叫操作员的 Microsoft 文档 没有讨论使用呼叫操作员时会发生什么,它仅说明以下内容:

运行命令、脚本或脚本块。调用运算符也称为“调用运算符”,可让您运行存储在变量中并由字符串表示的命令。由于调用运算符不解析命令,因此无法解释命令参数。


此外,如果这是预期的行为,是否有其他方法可以让调用运算符导致错误而不是让它继续?

powershell
4个回答
27
投票

返回代码不是 PowerShell 错误 - 它的查看方式与任何其他变量相同。

然后,您需要使用 PowerShell 对变量进行操作,并且

throw
出现错误,以便您的脚本将其视为终止错误:

$ErrorActionPreference = "Stop"

& cmd.exe /c "exit 1"

if ($LASTEXITCODE -ne 0) { throw "Exit code is $LASTEXITCODE" }

21
投票

在几乎所有的 PowerShell 脚本中,我更喜欢“快速失败”,因此我几乎总是有一个如下所示的小函数:

function Invoke-NativeCommand() {
    # A handy way to run a command, and automatically throw an error if the
    # exit code is non-zero.

    if ($args.Count -eq 0) {
        throw "Must supply some arguments."
    }

    $command = $args[0]
    $commandArgs = @()
    if ($args.Count -gt 1) {
        $commandArgs = $args[1..($args.Count - 1)]
    }

    & $command $commandArgs
    $result = $LASTEXITCODE

    if ($result -ne 0) {
        throw "$command $commandArgs exited with code $result."
    }
}

所以对于你的例子我会这样做:

Invoke-NativeCommand cmd.exe /c "exit 1"

...这会给我一个很好的 PowerShell 错误,如下所示:

cmd /c exit 1 exited with code 1.
At line:16 char:9
+         throw "$command $commandArgs exited with code $result."
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (cmd /c exit 1 exited with code 1.:String) [], RuntimeException
    + FullyQualifiedErrorId : cmd /c exit 1 exited with code 1.

0
投票

如果命令失败,您可以在同一行代码上抛出错误:

& cmd.exe /c "exit 1"; if(!$?) { throw }

自动变量:

$?


0
投票

从 PowerShell 7.4 开始,有一个

$PSNativeCommandUseErrorActionPreference
变量可以更改为
$true
以使非零退出代码的行为与
$ErrorActionPreference
有关。

请参阅 about_Preference_Variables

© www.soinside.com 2019 - 2024. All rights reserved.