処理を行う必要があるサーバーが 4 台あります。処理は次の 2 つの部分で行われます。
- バッチ ファイルを実行する
- PowerShell スクリプトを実行する
すべてのサーバーでバッチ ファイルを同時に、理想的には正確に同時に実行する必要があります。ネットワークタイムサービスを使用して同期しているため、現在、すべてのサーバーでスケジュールされたタスクをセットアップしています。
次に、Powershell スクリプトを次々に実行する必要があります。つまり、Server1 のスクリプトが終了すると、Server2 のスクリプトが開始され、終了すると Server3 が開始されます。これは、パート 1 と同じ方法で実行できます。つまり、スケジュールされたタスクですが、タスクが完了するまでにかかる時間は大きく異なります。
時間が同期されていても、バッチ ファイルのスケジュールされたタスク オプションを避けたいと思います。最後に、異なるサーバー間でキューのような方法で Powershell スクリプトを呼び出す方法についての提案が必要です。これは可能ですか?
編集 2012-04-11
キース・ヒルの答えの助けを借りて、私は必要なものに近づくことができました。この時点でコードを投稿することは理にかなっています。
# $strServers[0] must correspond to $strFiles[0]
# $strServers[1] must correspond to $strFiles[1]
# etc.
$strServers = @(
"di-ads-02",
"di-ads-03",
"si-ads-02",
"vm-ads-02"
);
$strFiles = @(
"D:\Utilities\test.ps1",
"D:\Utilities\test.ps1",
"C:\Utilities\test.ps1",
"D:\Utilities\test.ps1"
);
try
{
for ($i = 0; $i -lt $strFiles.Count; $i++)
{
$job = Invoke-Command -cn $strServers[$i] -ScriptBlock {Invoke-Expression $strFiles[$i]} -AsJob;
# Wait for $job to finish for a maximum of 60 minutes
Wait-Job $job -Timeout 3600;
}
}
catch
{
Write-Host "ERROR : " + $_;
}
PowerShell から次の出力が得られます。
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
47 Job47 Failed False di-ads-02 Invoke-Expression $str...
49 Job49 Failed False di-ads-03 Invoke-Expression $str...
51 Job51 Failed False si-ads-02 Invoke-Expression $str...
53 Job53 Failed False vm-ads-02 Invoke-Expression $str...
途中まで来ているように見えますが、実行は失敗しています。最初は実行されているのではないかと思いましたが、正しく報告されていませんでした。次に、test.ps1
実行時に 2 つのファイル (stderr と stdout) を出力するようにスクリプトを変更し、証拠を残すようにしました。これらのサーバーにリモート接続してスクリプトをローカルで実行すると、これらのファイルが生成されますが、上記のスクリプトのように実行しても機能しません。
どんな助けでも大歓迎です。