相互に依存するウィンドウ アプリケーションを正しい順序で起動するために使用される DOS スタイルの .cmd ファイルを想像してみてください。
例:
1) パラメータを指定して exe を呼び出して、サーバー アプリケーションを起動します。
2) サーバーが初期化されるまで (または一定時間) 待ちます。
3) パラメータを指定して exe を呼び出し、クライアント アプリケーションを起動します。
PowerShell でこの種のバッチ ジョブを実行する最も簡単な方法は何ですか?
相互に依存するウィンドウ アプリケーションを正しい順序で起動するために使用される DOS スタイルの .cmd ファイルを想像してみてください。
例:
1) パラメータを指定して exe を呼び出して、サーバー アプリケーションを起動します。
2) サーバーが初期化されるまで (または一定時間) 待ちます。
3) パラメータを指定して exe を呼び出し、クライアント アプリケーションを起動します。
PowerShell でこの種のバッチ ジョブを実行する最も簡単な方法は何ですか?
PowerShell は .Net オブジェクトにアクセスできることに注意してください。Blair Conradによって提案された Start-Sleepは、サーバー プロセスのWaitForInputIdleへの呼び出しに置き換えることができるため、クライアントを起動する前にサーバーの準備が整ったことがわかります。
$sp = get-process server-application
$sp.WaitForInputIdle()
Process.Startを使用してプロセスを開始し、正確なプロセスを返すようにすることもできます。その後、取得プロセスは必要ありません。
$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()
$cp = [diagnostics.process]::start("client-application", "params")
@Lars Truijensが提案
PowerShell は .Net オブジェクトにアクセスできることに注意してください。Blair Conrad によって提案された Start-Sleep は、サーバー プロセスの WaitForInputIdle への呼び出しに置き換えることができるため、クライアントを起動する前にサーバーの準備が整ったことがわかります。
これは、固定された (またはパラメーターを介して指定された) 時間だけスリープするよりもエレガントです。ただし、 WaitForInputIdle
ユーザー インターフェイスを使用するプロセスにのみ適用されるため、メッセージ ループが発生します。
したがって、launch-server-application の特性によっては、これが機能しない場合があります。ただし、Lars が私に指摘したように、質問はウィンドウ化されたアプリケーション (質問を読んだときに見逃した) に言及していたので、彼の解決策がおそらく最善です。
アプリケーションを起動するまでに 10 秒待つには、試してください。
launch-server-application serverparam1 serverparam2 ...
Start-Sleep -s 10
launch-client-application clientparam1 clientparam2 clientparam3 ...
スクリプトを作成して引数を渡したい場合は、runlinkedapps.ps1 (または何でも) という名前のファイルを次の内容で作成します。
launch-server-application $args[0] $args[1]
Start-Sleep -s 10
launch-client-application $args[2] $args[3] $args[4]
または、runlinkedapps.ps1 の実行に使用する回線でサーバーとクライアントのパラメーターを配布することを選択します。必要に応じて、ハードコーディングする代わりに、ここで遅延を渡すこともできます10
。
.ps1 ファイルはパス上にある必要があることに注意してください。そうしないと、実行時にその場所を指定する必要があります。(ああ、私は launch-server-application と launch-client-application がパス上にあると仮定しました - そうでない場合は、それらへのフルパスも指定する必要があります。)