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

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

这就是我得到的…

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

当前回答

总是有cmd。

cmd /c start /wait notepad

Or

notepad | out-host

其他回答

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

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

只需使用“Wait-process”:

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

工作完成了

除了使用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。

通常,对于内部命令,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-Process需要-ArgumentList开关来传递参数,不太方便。 还有另一种方法。

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