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

在bash中,我可以输入cmd1 && cmd2

这就是我得到的…

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

当前回答

如果使用Start-Process <path来exe> -NoNewWindow -Wait . exe

您还可以使用-PassThru选项来回显输出。

其他回答

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

根据左边管道的成功,有条件地执行右边管道。 #如果Get-Process成功找到一个名为notepad的进程, # Stop-Process -Name记事本被调用 获取进程记事本&&停止进程-Name记事本

关于文档的进一步信息

只需使用“Wait-process”:

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

工作完成了

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

e.g.

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

有些程序不能很好地处理输出流,使用管道Out-Null可能不会阻塞它。 Start-Process需要-ArgumentList开关来传递参数,不太方便。 还有另一种方法。

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)

总是有cmd。

cmd /c start /wait notepad

Or

notepad | out-host