web-dev-qa-db-ja.com

次のコマンドを開始する前に、各コマンドの終了を待つようにPowerShellに指示する方法

私はPowerShell 1.0スクリプトを使って、たくさんのアプリケーションを開くことができます。最初のものは仮想マシンで、他のものは開発アプリケーションです。他のアプリケーションが開かれる前に仮想マシンの起動を完了させたい。

一言で言えば私は"cmd1 && cmd2"を言うことができます

これは私が持っているものです...

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

通常、内部コマンドの場合、PowerShellは次のコマンドを開始する前に待機します。この規則の1つの例外は、外部のWindowsサブシステムベースのEXEです。最初のトリックは、以下のようにOut-Nullにパイプラインすることです。

Notepad.exe | Out-Null

PowerShellは、Notepad.exeプロセスが終了するまで待機してから続行します。それは気の利いたものですが、コードを読むことから拾うのは微妙です。 -Waitパラメータを指定してStart-Processを使用することもできます。

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

PowerShell Community Extensionsバージョンを使用している場合は、次のようになります。

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

PowerShell 2.0のもう1つのオプションは、バックグラウンドジョブを使用することです。

$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
315
Keith Hill

Start-Process -Waitを使用する以外に、実行可能ファイルの出力をパイプ処理すると、Powershellは待機します。必要に応じて、私は通常Out-NullOut-DefaultOut-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スタイルの演算子(&、&&、||)がありません。私たちは Powershellではもっと冗長 でなければならないようです。

44
Nathan Hartley

単に "Wait-process"を使用してください。

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

仕事は終わった

11
Flaviofire

Start-Process <path to exe> -NoNewWindow -Waitを使うなら

エコー出力に-PassThruオプションを使用することもできます。

6
Sandy Chapman

出力ストリームをうまく処理できないプログラムもあります。パイプを使ってOut-Nullにブロックしてもブロックされない場合があります。
そしてStart-Processは引数を渡すために-ArgumentListスイッチを必要としますが、あまり便利ではありません。
他にも方法があります。

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

オプション-NoNewWindowを含めるとエラーが発生します。Start-Process : This command cannot be executed due to the error: Access is denied.

私がそれを機能させることができる唯一の方法は電話することでした:

Start-Process <path to exe> -Wait
2
twasbrillig

それをさらに取ると、その場でパースすることさえできます

例えば.

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}
0
Justin