我有一组测试DLL,我从PowerShell脚本运行,通过Start-Process
命令调用OpenCover.Console.exe。
我设置了-returntargetcode
标志
执行后,我会检查$lastexitcode
和$?
。它们总是分别返回1和True。即使测试失败了。
当所有测试通过时,不应该{0} {0} {0}当它们失败时为0 {/ p>
答案 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文件头中的标志。
Start-Process -PassThru -Wait
在这种情况下也适用,只是有点复杂。