PowerShell Start-Process未设置$ lastexitcode

时间:2016-09-14 17:57:19

标签: powershell

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

我设置了-returntargetcode标志

执行后,我会检查$lastexitcode$?。它们总是分别返回1和True。即使测试失败了。

当所有测试通过时,不应该{0} {0} {0}当它们失败时为0 {/ p>

2 个答案:

答案 0 :(得分:4)

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

退出
cmd /c exit 2
$LASTEXITCODE

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

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

当然,这种方法的优点是你不需要等待这个过程,但是当它退出后你就可以在$p中运行它的信息。

答案 1 :(得分:0)

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

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

notepad.exe | Out-Null
echo $LASTEXITCODE

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


@Burt_Harris的答案中建议的

Start-Process -PassThru -Wait在这种情况下也适用,只是有点复杂。