如何告诉PowerShell等待每个命令结束后才开始下一个?

我有一个PowerShell 1.0脚本来打开一堆应用程序。第一个是虚拟机,其他是开发应用程序。我希望虚拟机在打开其余应用程序之前完成引导。

在bash中,我只能说"cmd1 && cmd2"

这就是我得到的…

C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
592246 次浏览

通常,对于内部命令,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

除了使用Start-Process -Wait外,通过管道输出可执行文件将使Powershell等待。根据需要,我通常会将管道连接到Out-NullOut-DefaultOut-StringOut-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更加详细

如果你使用Start-Process <path to exe> -NoNewWindow -Wait

你也可以使用-PassThru选项来回显输出。

一些程序不能很好地处理输出流,使用pipe Out-Null可能不会阻塞它 而且Start-Process需要-ArgumentList开关来传递参数,不太方便 还有另一种方法。< / p >
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)

只需使用“Wait-process”:

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

工作完成了

包括选项-NoNewWindow会给我一个错误:Start-Process : This command cannot be executed due to the error: Access is denied.

我能让它工作的唯一方法就是打电话:

Start-Process <path to exe> -Wait

更进一步说,您甚至可以在运行中进行解析

如。

& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}

总是有cmd。

cmd /c start /wait notepad

notepad | out-host

这个问题很久以前就提出了,但由于这里的答案是参考,我可能会提到一个最新的用法。对于PowerShell的当前实现(编写时为7.2 LTS),您可以像在Bash中那样使用&&

根据左边管道的成功,有条件地执行右边管道。

   # If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad

关于文档的进一步信息

基于@Justin &@Nathan Hartley的回答:

& "my.exe" | Out-Null    #go nowhere
& "my.exe" | Out-Default # go to default destination  (e.g. console)
& "my.exe" | Out-String  # return a string

管道会实时返回

& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}

注意:如果执行的程序返回的不是0 exitcode,则管道将无法工作。你可以强制它使用重定向操作符,例如2>&1

& "my.exe" 2>&1 | Out-String

来源:

https://stackoverflow.com/a/7272390/254276 < a href = " https://stackoverflow.com/a/7272390/254276 " > < / >

https://social.technet.microsoft.com/forums/windowsserver/en-US/b6691fba-0e92-4e9d-aec2-47f3d5a17419/start-process-and-redirect-output-to-powershell-window