Answers:
通常,对于内部命令,PowerShell会在启动下一个命令之前等待。此规则的一个例外是基于Windows子系统的外部EXE。第一个技巧是流水线Out-Null
喜欢这样:
Notepad.exe | Out-Null
PowerShell将等待,直到退出Notepad.exe进程,然后再继续。这很漂亮,但是从阅读代码中可以看出有些微妙。您还可以将Start-Process与-Wait参数一起使用:
Start-Process <path to exe> -NoNewWindow -Wait
如果您使用的是PowerShell社区扩展版本,则为:
$proc = Start-Process <path to exe> -NoNewWindow -PassThru
$proc.WaitForExit()
PowerShell 2.0中的另一个选项是使用后台作业:
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
| out-null
正是我所需要的。尝试过使用,Start-Job
但是因为我将函数的结果作为参数传递,所以我有点不满意,所以我不能使用最后的建议……
-ArgumentList
,请使用逗号分隔它们,例如-ArgumentList /D=test,/S
。
除了使用之外,通过Start-Process -Wait
管道传递可执行文件的输出将使Powershell等待。根据不同的需要,我通常会管Out-Null
,Out-Default
,Out-String
或Out-String -Stream
。这是其他一些输出选项的一长串。
# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String
# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }
# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com
我确实想念您引用的CMD / Bash样式运算符(&,&&,||)。看来我们对Powershell更加详细。
Out-String
Start-Process
某些程序无法很好地处理输出流,使用管道Out-Null
可能无法阻止输出流。
而且Start-Process
需要-ArgumentList
开关来传递参数,不太方便。
还有另一种方法。
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)