回答:
通常、内部コマンドの場合、PowerShellは次のコマンドを開始する前に待機します。このルールの1つの例外は、外部WindowsサブシステムベースのEXEです。最初のトリックは、次のOut-Null
ようにパイプライン処理することです。
Notepad.exe | Out-Null
PowerShellは、Notepad.exeプロセスが終了するまで待機してから続行します。それは気の利いたものですが、コードを読むことから拾うのはちょっと微妙です。Start-Processを-Waitパラメーターと共に使用することもできます。
Start-Process <path to exe> -NoNewWindow -Wait
PowerShell Community Extensionsバージョンを使用している場合:
$proc = Start-Process <path to exe> -NoNewWindow -PassThru
$proc.WaitForExit()
PowerShell 2.0のもう1つのオプションは、バックグラウンドジョブを使用することです。
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
| out-null
私が必要とするものだけをしました。使用してみましたStart-Job
が、関数の結果をパラメーターとして渡しているため、少しスキッツォイドが表示され、最後の提案を使用できませんでした...
-ArgumentList
で渡す必要がある場合は、のようにコンマで区切ります-ArgumentList /D=test,/S
。
の使用Start-Process -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スタイルの演算子(&、&&、||)が欠けています。Powershellではもっと冗長にする必要があるようです。
Out-String
は出力を単一の複数行の文字列に変更しますが、PowerShellはデフォルトで行の配列を返します。Start-Process
(本当に新しいウィンドウで実行したい場合を除いて)コンソールアプリケーションでは、出力をキャプチャしたりリダイレクトしたりすることはできないため、避けてください。
使用する場合 Start-Process <path to exe> -NoNewWindow -Wait
-PassThru
オプションを使用して出力をエコーすることもできます。
-PassThru
エコーしないことに注意してください(非コンソールアプリケーションは、コンソール出力を生成しません)。新しく起動されたプロセスを表すインスタンスを出力するため、そのプロパティを調べて、後で終了するのを待つことができます。System.Diagnostics.Process
一部のプログラムは出力ストリームをうまく処理できず、パイプを使用してOut-Null
ブロックしない場合があります。
そして、Start-Process
必要が-ArgumentList
ないので便利、引数を渡すようにスイッチを。
別のアプローチもあります。
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
オプション-NoNewWindow
を含めるとエラーが発生します。Start-Process : This command cannot be executed due to the error: Access is denied.
私がそれを機能させる唯一の方法は、呼び出すことでした:
Start-Process <path to exe> -Wait