我有一组测试DLL,我从powershell脚本运行,该脚本通过Start-Process
命令调用OpenCover.Console.exe。
我设置了-returntargetcode
标志
执行后,我检查$lastexitcode
和$?
,它们始终分别返回1和True,即使测试失败也是如此。
当所有测试都通过时$lastexitcode
不应该是0,当它们失败时$lastexitcode
不应该是1吗?
我有一组测试DLL,我从powershell脚本运行,该脚本通过Start-Process
命令调用OpenCover.Console.exe。
我设置了-returntargetcode
标志
执行后,我检查$lastexitcode
和$?
,它们始终分别返回1和True,即使测试失败也是如此。
当所有测试都通过时$lastexitcode
不应该是0,当它们失败时$lastexitcode
不应该是1吗?
2条答案
按热度按时间unhi4e5o1#
默认情况下,
Start-Process
是异步的,因此它不会等待进程退出。如果希望命令行工具同步运行,请删除Start-Process
并直接调用该命令。这是设置$LASTEXITCODE
的唯一方法。例如,导致CMD.exe以2:您可以通过添加
-Wait
标志使Start-Process
同步,但它仍然不会设置$LASTEXITCODE
。要从Start-Process
获取ExitCode,请将-PassThru
添加到Start-Process
,然后Start-Process
输出一个[System.Diagnostics.Process]
对象,您可以使用该对象监视进程。并(最终)访问它的ExitCode
属性。下面是一个应该会有所帮助的示例:当然,这种方法的优点是您不需要等待进程,但是稍后当它退出时,您就可以获得有关它在
$p
中运行的信息。hsgswve42#
当执行GUI应用程序时,删除
Start-Process
没有帮助,因为PowerShell不会等待GUI应用程序完成,因此不设置$LASTEXITCODE
。通过管道传输(不存在的)GUI应用程序输出会有所帮助,因为它会使PowerShell等待应用程序完成。
@Burt_Harris在回答中建议的
Start-Process -PassThru -Wait
在这种情况下也有效,只是稍微复杂一些。