如何告诉PowerShell在启动下一个命令之前等待每个命令结束?

如何告诉PowerShell在启动下一个命令之前等待每个命令结束?,powershell,wait,execution,Powershell,Wait,Execution,我有一个PowerShell 1.0脚本,可以打开一堆应用程序。第一个是虚拟机,其他是开发应用程序。我希望虚拟机在其他应用程序打开之前完成引导 在bash中,我只能说“cmd1&&cmd2” 这就是我得到的 C:\Applications\VirtualBox\vboxmanage startvm superdooper &"C:\Applications\NetBeans 6.5\bin\netbeans.exe" 通常,对于内部命令,PowerShell会在启动下一个命令之

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

在bash中,我只能说
“cmd1&&cmd2”

这就是我得到的

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

通常,对于内部命令,PowerShell会在启动下一个命令之前等待。此规则的一个例外是基于外部Windows子系统的EXE。第一个技巧是通过管道将
输出为Null
,如下所示:

Notepad.exe | Out-Null
PowerShell将等待Notepad.exe进程退出后再继续。这很漂亮,但从阅读代码中可以看出有点微妙。还可以将启动进程与-Wait参数一起使用:

Start-Process <path to exe> -NoNewWindow -Wait

除了使用
启动进程-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样式运算符(&、&&、| |)。信息技术
似乎我们必须这样做。

如果您使用
启动流程-nonewindow-Wait


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

一些程序不能很好地处理输出流,使用管道输出空值可能不会阻止它。
启动进程
需要
-ArgumentList
开关来传递参数,这不太方便。
还有另一种方法

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
$exitCode=[Diagnostics.Process]::Start(,).WaitForExit()
只需使用“等待过程”:


作业已完成

包括选项
-nonewindow
给我一个错误:
启动进程:由于错误无法执行此命令:访问被拒绝。

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

Start-Process <path to exe> -Wait
启动进程-等待

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

e、 g


总有一天。如果您在引用参数以启动流程时遇到问题,则可能不会那么烦人:

cmd /c start /wait notepad


我的错。开始过程-等待工作的伟大,但现在我看到它,这不是我一直在寻找。。。我实际上是在等待vm完成引导。我想这会很难。我想我得找一条新的线索。谢谢,但是。太棒了,
| out null
正是我所需要的。尝试使用
开始作业
,但因为我将函数的结果作为参数传递,所以我有点不耐烦,所以我不能使用最后一个建议…作为旁注,如果需要使用
-ArgumentList
传递多个参数,请使用逗号分隔它们,如
-ArgumentList/D=test,/S
。感谢您提供了简单的“| Out Null”解决方案!“Start Process-nonewindow-Wait”方法的问题是,PowerShell会暂停,直到父进程生成的所有子进程都完成为止,即使父进程在它们之前终止。这导致了我们的安装程序出现问题。这是我用来等待VM启动时启动AzureRmVM-ResourceGroupName$ResourceGroupName-Name$VmName而((Get-AzureRmVM-ResourceGroupName$ResourceGroupName-Name$VmName-Status | `选择-ExpandProperty Status |`?{$\代码-match“PowerState”}|`select-ExpandProperty DisplayStatus)-ne“VM running”){Start Sleep-s2}Start Sleep-s5 35;#给虚拟机一点时间,让它可以接受远程请求显示多个参数在该调用中起作用吗?它们是如何划分的?如何处理各种嵌套字符串转义?泰@AnneTheAgile使用空格分隔参数,对于字符转义,使用反斜杠@ifree,我确实让testcomplete以这种方式运行!我在空格分隔的参数列表中使用了单引号。[1];但是现在echo$exitcode=false,这不是我从进程返回的代码?[1] $exitCode=[Diagnostics.Process]::Start(“c:\Program Files(x86)\SmartBear\TestComplete 10\Bin\TestComplete.exe”,“c:\Users\ME\Documents\TestComplete 10 Projects\hig4TestProject1\hig4TestProject1.pjs”/run/project:myProj/test:“关键字测试| zTdd1\u Good”/exit”)。WaitForExit(60)如果您需要解析输出,这是一个非常好的解决方案!指出xxxx重定向器列表很快让我明白了为什么我应该使用out Default而不是out Null,因为我需要保持控制台输出。请注意,同步执行控制台应用程序不需要额外的工作-就像在任何shell中一样,这是默认行为。管道传输到
输出字符串
会将输出更改为单个多行字符串,而PowerShell默认情况下会返回一个行数组<对于控制台应用程序,应避免使用代码>启动进程(除非您真的希望在新窗口中运行它们),因为您将无法捕获或重定向它们的输出。实际上,本机命令是同步(带输出)运行还是异步运行取决于可执行文件。例如,在不捕获输出的情况下,以下仅输出“宾果”&'C:\ProgramFiles\Mozilla Firefox\Firefox.exe'-?;'注意,
-PassThru
不会回显输出(根据定义,非控制台应用程序不会产生控制台输出),它会输出一个代表新启动进程的
System.Diagnostics.Process
实例,因此您可以检查其属性并等待它稍后退出。
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
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 /c start /wait notepad
notepad | out-host