调度Powershell和批处理作业以同步运行

时间:2012-04-10 13:42:40

标签: windows powershell batch-file scheduled-tasks scheduling

我有4台服务器需要进行处理。处理分为两部分:

  1. 运行批处理文件
  2. 运行powershell脚本
  3. 我需要批处理文件在所有服务器上同时运行,理想情况是在同一时间。我目前在所有服务器上都设置了计划任务,因为我们使用网络时间服务,因此它们处于同步状态。

    然后我需要一个接一个地运行Powershell脚本,即当Server1上的脚本完成时,Server2上的脚本开始,然后当它完成时,Server3开始,等等。这可以像Part一样完成1,即计划任务,但任务需要大量不同的时间才能完成。

    我想避免批处理文件的计划任务选项,即使时间是同步的,我宁愿让它们从一个地方开始。最后,我需要有关如何在不同服务器上以类似队列的方式调用Powershell脚本的建议。这可能吗?

    修改2012-04-11

    在Keith Hill的回答的帮助下,我已经设法接近我需要的东西。在这一点上发布我的代码对我来说是有意义的:

    # $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脚本,以便在运行时输出两个文件(stderr和stdout),以便留下一些证据。当我远程访问这些服务器并在本地运行脚本时,会生成这些文件,但是按照上面的脚本执行它不起作用。

    任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您可以在服务器上启用PowerShell远程处理,则可以使用来自一台计算机的作业来协调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
}
相关问题