【问题标题】:PowerShell Start-Process not setting $lastexitcodePowerShell 启动进程未设置 $lastexitcode
【发布时间】:2019-08-10 15:14:51
【问题描述】:

我有一组测试 DLL,我从一个通过 Start-Process 命令调用 OpenCover.Console.exe 的 powershell 脚本运行。

我设置了-returntargetcode 标志

执行后我检查$lastexitcode$?。它们一直分别返回 1 和 True。即使测试失败。

$lastexitcode 不应该在所有测试都通过时为 0,在测试失败时为 1?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    默认情况下,Start-Process 是异步的,因此它不会等待您的进程退出。如果您希望您的命令行工具同步运行,请删除 Start-Process 并直接调用该命令。这是设置$LASTEXITCODE 的唯一方法。例如,导致 CMD.exe 以 2 退出:

    cmd /c exit 2
    $LASTEXITCODE
    

    您可以通过添加-Wait 标志使Start-Process 同步,但它仍然不会设置$LASTEXITCODE。要从Start-Process 获取 ExitCode,您将-PassThru 添加到您的Start-Process,然后输出一个[System.Diagnostics.Process] 对象,您可以使用该对象来监控进程,并(最终)访问其ExitCode 属性。这是一个应该有帮助的例子:

    $p = Start-Process "cmd" -ArgumentList "/c exit 2" -PassThru -Wait
    $p.ExitCode
    

    当然,这种方法的优点是您不需要等待进程,但稍后当它退出时,您会在$p 中获得有关它运行的信息。

    【讨论】:

    • 是 -PassThru 为我修复了它!谢谢
    【解决方案2】:

    在执行 GUI 应用程序时,删除 Start-Process 没有帮助,因为 PowerShell 在以这种方式直接执行它们时不会等待 GUI 应用程序完成。所以$LASTEXITCODE 没有设置。

    管道(不存在的)GUI 应用程序输出有帮助,因为它使 PowerShell 等待应用程序完成。

    notepad.exe | Out-Null
    echo $LASTEXITCODE
    

    请注意,“GUI 应用程序”并不一定意味着该应用程序具有窗口。应用程序是 GUI 还是控制台是 .exe 文件头中的标志。


    @Burt_Harris 的回答中建议的Start-Process -PassThru -Wait 在这种情况下也有效,只是模式有点复杂。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2011-04-27
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多