PowerShell启动进程未设置$lastexitcode

dy2hfwbg  于 2023-02-16  发布在  Shell
关注(0)|答案(2)|浏览(209)

我有一组测试DLL,我从powershell脚本运行,该脚本通过Start-Process命令调用OpenCover.Console.exe。
我设置了-returntargetcode标志
执行后,我检查$lastexitcode$?,它们始终分别返回1和True,即使测试失败也是如此。
当所有测试都通过时$lastexitcode不应该是0,当它们失败时$lastexitcode不应该是1吗?

unhi4e5o

unhi4e5o1#

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

cmd /c exit 2
$LASTEXITCODE

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

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

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

hsgswve4

hsgswve42#

当执行GUI应用程序时,删除Start-Process没有帮助,因为PowerShell不会等待GUI应用程序完成,因此不设置$LASTEXITCODE
通过管道传输(不存在的)GUI应用程序输出会有所帮助,因为它会使PowerShell等待应用程序完成。

notepad.exe | Out-Null
echo $LASTEXITCODE
  • 请注意,“GUI应用程序”并不一定意味着应用程序具有窗口。应用程序是GUI还是控制台是.exe文件头中的一个标志。*

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

相关问题