为什么PowerShell脚本在使用调用操作符的非零退出代码时不结束?

wpx232ag  于 2023-05-07  发布在  Shell
关注(0)|答案(3)|浏览(130)

为什么PowerShell脚本在使用调用操作符和$ErrorActionPerference = "Stop"时存在非零退出代码时不会结束?
使用下面的例子,我得到结果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的Call Operator文档没有讨论使用Call Operator时应该发生的情况,它只说明了以下内容:
运行命令、脚本或脚本块。调用操作符,也称为“调用操作符”,允许您运行存储在变量中并由字符串表示的命令。因为调用运算符不解析命令,所以它不能解释命令参数。
此外,如果这是预期的行为,是否有其他方法可以让调用操作符导致错误,而不是让它继续?

d6kp6zgx

d6kp6zgx1#

返回代码不是 PowerShell 错误-它与任何其他变量的方式相同。
然后,您需要使用PowerShell对变量和throw错误进行操作,以便您的脚本将其视为终止错误:

$ErrorActionPreference = "Stop"

& cmd.exe /c "exit 1"

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

oogrdqng2#

在我几乎所有的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.
owfi6suc

owfi6suc3#

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

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

自动变量:$?

相关问题