5

相互に依存するウィンドウ アプリケーションを正しい順序で起動するために使用される DOS スタイルの .cmd ファイルを想像してみてください。

例:
1) パラメータを指定して exe を呼び出して、サーバー アプリケーションを起動します。
2) サーバーが初期化されるまで (または一定時間) 待ちます。
3) パラメータを指定して exe を呼び出し、クライアント アプリケーションを起動します。

PowerShell でこの種のバッチ ジョブを実行する最も簡単な方法は何ですか?

4

3 に答える 3

5

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")
于 2008-09-08T12:00:05.800 に答える
1

@Lars Truijensが提案

PowerShell は .Net オブジェクトにアクセスできることに注意してください。Blair Conrad によって提案された Start-Sleep は、サーバー プロセスの WaitForInputIdle への呼び出しに置き換えることができるため、クライアントを起動する前にサーバーの準備が整ったことがわかります。

これは、固定された (またはパラメーターを介して指定された) 時間だけスリープするよりもエレガントです。ただし、 WaitForInputIdle

ユーザー インターフェイスを使用するプロセスにのみ適用されるため、メッセージ ループが発生します。

したがって、launch-server-application の特性によっては、これが機能しない場合があります。ただし、Lars が私に指摘したように、質問はウィンドウ化されたアプリケーション (質問を読んだときに見逃した) に言及していたので、彼の解決策がおそらく最善です。

于 2008-09-08T12:45:30.140 に答える
0

アプリケーションを起動するまでに 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 がパス上にあると仮定しました - そうでない場合は、それらへのフルパスも指定する必要があります。)

于 2008-09-08T11:37:46.493 に答える