我有一個PowerShell 1.0腳本來打開一堆應用程序。第一個是虛擬機,其他是開發應用程序。我希望虛擬機在其他應用程序打開之前完成引導。如何讓PowerShell在開始下一步之前等待每個命令結束?
在bash我只能說"cmd1 && cmd2"
這是我得到了什麼?
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
我有一個PowerShell 1.0腳本來打開一堆應用程序。第一個是虛擬機,其他是開發應用程序。我希望虛擬機在其他應用程序打開之前完成引導。如何讓PowerShell在開始下一步之前等待每個命令結束?
在bash我只能說"cmd1 && cmd2"
這是我得到了什麼?
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
通常情況下,內部的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
除了使用Start-Process -Wait
,管道可執行文件的輸出將PowerShell的等待。根據需要,我通常會輸入Out-Null
,Out-Default
,Out-String
或Out-String -Stream
。 Here是一些其他輸出選項的長列表。
# 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。
如果你需要解析輸出,這是一個非常好的解決方案! – 2018-01-17 06:27:32
如果使用Start-Process <path to exe> -NoNewWindow -Wait
您還可以使用-PassThru
選項呼應輸出。
某些程序無法很好地處理輸出流,使用管道對Out-Null
可能不會阻止它。
和Start-Process
需要-ArgumentList
切換參數傳遞,不太方便。
還有另一種方法。
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
該調用中的多個參數如何工作?他們如何劃界?如何處理各種嵌套字符串轉義? TY! – AnneTheAgile 2015-01-13 23:00:40
@AnneTheAgile [doc](http://msdn.microsoft.com/en-us/library/h6ak8zt5(v = vs.110).aspx)使用空格分隔參數,char轉義使用反斜槓 – ifree 2015-01-14 05:35:44
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
只要使用 「等待處理」:
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
工作已經完成
包括選項-NoNewWindow
給我一個錯誤:Start-Process : This command cannot be executed due to the error: Access is denied.
我能得到的唯一辦法上班打電話:
Start-Process <path to exe> -Wait
我的不好。啓動過程 - 等效果很好,但現在我看到它不是我正在尋找的... 我實際上是想等到vm完成啓動。我想這會很艱難。我想我必須找到一個新的線程。謝謝,但是。 – 2009-11-20 00:37:46
輝煌,'| out-null「正是我所需要的。嘗試使用'開始工作',但因爲我通過功能的結果作爲參數,它對我有點skitzoid,所以我不能使用最後的建議... – jcolebrand 2012-09-11 16:19:27
作爲一個方面說明,如果你需要用'-ArgumentList'傳遞多個參數,用'-ArgumentList/D = test,/ S'等逗號分隔它們。 – sschuberth 2015-09-04 13:05:34