2009-11-16 224 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 
相關問題