私はPowerShell 1.0スクリプトを使って、たくさんのアプリケーションを開くことができます。最初のものは仮想マシンで、他のものは開発アプリケーションです。他のアプリケーションが開かれる前に仮想マシンの起動を完了させたい。
一言で言えば私は"cmd1 && cmd2"
を言うことができます
これは私が持っているものです...
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
通常、内部コマンドの場合、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
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ではもっと冗長 でなければならないようです。
単に "Wait-process"を使用してください。
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
仕事は終わった
Start-Process <path to exe> -NoNewWindow -Wait
を使うなら
エコー出力に-PassThru
オプションを使用することもできます。
出力ストリームをうまく処理できないプログラムもあります。パイプを使って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
それをさらに取ると、その場でパースすることさえできます
例えば.
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}