我们的构建系统使用 pwsh(Powershell 7.4.0)执行大量命令来构建和测试我们的软件。我们最近遇到了一个问题,类似以下示例的操作在新窗口中启动了我们的测试工具,导致我们的测试似乎通过了而不是失败。这两者之间为什么有区别,我们如何才能强化(除了删除空格)?
这个似乎启动了测试,但却默默失败了
PS C:\Temp>& "${Env:NUNIT_LOCATION}\nunit-console-x86.exe " CodeUnderTest.dll
PS C:\Temp>$LastExitCode
0
这个按预期工作并在命令行上报告失败(并修改返回代码):
PS C:\Temp>& "${Env:NUNIT_LOCATION}\nunit-console-x86.exe" CodeUnderTest.dll
<test error outputs here>
PS C:\Temp>$LastExitCode
35
您看到的是一个可以说是错误的东西,它同时存在于Windows PowerShell(旧版、随 Windows 一起提供、仅适用于 Windows 的 PowerShell 版本,其最新版本是 5.1)和PowerShell (Core) 7(现代、跨平台、按需安装版本)中(自 7.5.0 起):
由于路径中带有尾随空格,PowerShell 无法将可执行文件识别为可执行文件(应用程序)。
相反,它将其视为一个文档,因此执行相当于调用[1]
Start-Process
的操作,以便将调用委托给Windows(GUI)shell,这有两层含义:您尝试启动的控制台应用程序将在一个新的控制台窗口中打开,该窗口会在应用程序退出时自动关闭。
它是异步启动的,因此它的退出代码不会被捕获到自动
$LASTEXITCODE
变量中,所以$LASTEXITCODE
之前有效的内容仍然有效。除了编写一个通用包装函数来修剪可执行路径中的尾随空格之外,您还可以执行临时修剪;例如:
[1]可以与switch同步
Start-Process
运行,switch 可用于使调用输出一个实例,然后可以查询该实例的属性,但请注意,除非在特殊情况下,否则没有理由将其用于执行控制台应用程序,尤其是因为您无法直接捕获它们的输出。有关更多信息,请参阅此答案。-Wait
-PassThru
System.Diagnostics.Process
.ExitCode
Start-Process