【发布时间】:2022-01-13 02:35:07
【问题描述】:
我执行了以下三个 powershell 命令。前两个命令没有返回结果,第三个命令返回了结果。这三个命令的主要区别在于wait参数和括号的使用。
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/I C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru | Foreach-Object -Process { $_.exitcode }
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/I C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -wait | Foreach-Object -Process { $_.exitcode }
PS C:\Users> (Start-Process -FilePath 'msiexec' -ArgumentList '/I C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -Wait) | Foreach-Object -Process { $_.exitcode }
1619
我测试了另外两个命令,它们之间的区别在于括号的使用。无论带括号,这两个命令都返回结果。
PS C:\Users> Start-Process -FilePath 'msiexec' -ArgumentList '/I C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru | Foreach-Object -Process { $_.id }
22980
PS C:\Users> (Start-Process -FilePath 'msiexec' -ArgumentList '/I C:\Users\Downloads\Everything-1.4.1.1015.x64.msi -quiet' -PassThru -Wait) | Foreach-Object -Process { $_.id }
8064
感谢 -wait 参数的解释。我仍然对括号造成的差异感到困惑。希望得到更多的答复。
【问题讨论】:
-
不能在进程退出之前填充
ExitCode属性 --Wait导致Start-Process等到目标进程退出后再返回 -
命令 2 和 3 都使用 -Wait,但是命令 2 没有返回结果。
-
请查看您发布的代码 - 只有第三个有
-Wait开关 -
我理解wait参数造成的差异,但我也想知道括号造成的差异。
-
好点,@Santiago:
(...)强制等待Start-Process作为一个整体 退出,并且(与-Wait)只有那个 i> 保证进程真正退出;相比之下,如果没有(...),新启动的进程会在它终止之前立即发送到管道,这就是为什么ForEach-Object还不能访问.ExitCode。
标签: windows powershell exit-code start-process