246

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

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

这就是我所拥有的...

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

8 回答 8

421

通常,对于内部命令,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
于 2009-11-16T15:08:04.630 回答
55

除了使用Start-Process -Wait,管道输出可执行文件将使 Powershell 等待。根据需要,我通常会通过管道传输到Out-NullOut-Default或. 是一些其他输出选项的长列表。Out-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

于 2011-09-01T15:11:48.433 回答
15

只需使用“等待过程”:

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

工作完成

于 2014-06-26T20:00:14.787 回答
8

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

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

于 2013-02-20T16:02:04.633 回答
8

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

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
于 2014-03-26T06:53:16.003 回答
3

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

我可以让它工作的唯一方法是打电话:

Start-Process <path to exe> -Wait
于 2014-12-31T00:54:44.930 回答
0

更进一步,您甚至可以动态解析

例如

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}
于 2018-04-11T14:09:09.663 回答
0

总是有cmd。

cmd /c start /wait notepad

或者

notepad | out-host
于 2019-12-10T15:19:26.083 回答