1

処理を行う必要があるサーバーが 4 台あります。処理は次の 2 つの部分で行われます。

  1. バッチ ファイルを実行する
  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) を出力するようにスクリプトを変更し、証拠を残すようにしました。これらのサーバーにリモート接続してスクリプトをローカルで実行すると、これらのファイルが生成されますが、上記のスクリプトのように実行しても機能しません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

サーバーでPowerShellリモート処理を有効にできる場合は、1台のマシンからのジョブを使用してPowerShellスクリプトの実行を調整できます。

$servers = 'server1','server2','server3','server4'
foreach ($server in $servers)
{
    $job = Invoke-Command -cn $server -Filepath c:\myscript.ps1 -AsJob
    Wait-Job $job -Timeout 180 # wait maximum of 3 minutes
}
于 2012-04-10T13:55:26.280 に答える