2009-11-16 226 views
135

我有一个PowerShell 1.0脚本来打开一堆应用程序。第一个是虚拟机,其他是开发应用程序。我希望虚拟机在其他应用程序打开之前完成引导。如何让PowerShell在开始下一步之前等待每个命令结束?

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

这是我得到了什么?

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

回答

235

通常情况下,内部的PowerShell命令开始下一个命令之前不等待。此规则的一个例外是基于外部Windows子系统的EXE。第一招是管道Out-Null像这样:

Notepad.exe | Out-Null 

PowerShell中会等到Notepad.exe进程已经持续了之前退出。从阅读代码中可以看出,这很漂亮但很微妙。您也可以使用开始处理与-Wait参数:

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

如果你正在使用PowerShell的社区扩展版本,它是:

$proc = Start-Process <path to exe> -NoWindow 
$proc.WaitForExit() 

在PowerShell 2.0中的另一种选择是使用一个后台作业:

$job = Start-Job { invoke command here } 
Wait-Job $job 
Receive-Job $job 
+1

我的不好。启动过程 - 等效果很好,但现在我看到它不是我正在寻找的... 我实际上是想等到vm完成启动。我想这会很艰难。我想我必须找到一个新的线程。谢谢,但是。 – 2009-11-20 00:37:46

+3

辉煌,'| out-null“正是我所需要的。尝试使用'开始工作',但因为我通过功能的结果作为参数,它对我有点skitzoid,所以我不能使用最后的建议... – jcolebrand 2012-09-11 16:19:27

+4

作为一个方面说明,如果你需要用'-ArgumentList'传递多个参数,用'-ArgumentList/D = test,/ S'等逗号分隔它们。 – sschuberth 2015-09-04 13:05:34

35

除了使用Start-Process -Wait,管道可执行文件的输出将PowerShell的等待。根据需要,我通常会输入Out-Null,Out-Default,Out-StringOut-String -StreamHere是一些其他输出选项的长列表。

# 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 /猛砸风格的操作。它 似乎我们必须是more verbose with Powershell

+0

如果你需要解析输出,这是一个非常好的解决方案! – 2018-01-17 06:27:32

5

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

您还可以使用-PassThru选项呼应输出。

3

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

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

该调用中的多个参数如何工作?他们如何划界?如何处理各种嵌套字符串转义? TY! – AnneTheAgile 2015-01-13 23:00:40

+1

@AnneTheAgile [doc](http://msdn.microsoft.com/en-us/library/h6ak8zt5(v = vs.110).aspx)使用空格分隔参数,char转义使用反斜杠 – ifree 2015-01-14 05:35:44

+0

ty @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:”KeywordTests | zTdd1_Good“/ exit').WaitForExit(60) – AnneTheAgile 2015-01-21 14:15:12

9

只要使用 “等待处理”:

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

工作已经完成

1

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

我能得到的唯一办法上班打电话:

Start-Process <path to exe> -Wait 
相关问题