windows - 安排 Powershell 和批处理作业同步运行

标签 windows powershell batch-file scheduled-tasks scheduling

我有 4 台服务器需要在其上进行一些处理。处理分为两部分:

  1. 运行批处理文件
  2. 运行 powershell 脚本

我需要批处理文件在所有服务器上同时运行,最好是在同一时间运行。我目前已经在所有服务器上设置了计划任务,因为我们使用网络时间服务,所以它们是同步的。

然后我需要一个接一个地运行 Powershell 脚本,即当服务器 1 上的脚本完成时,服务器 2 上的脚本开始,然后当它完成时,服务器 3 开始,等等。这可以用与部分相同的方式完成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),以便留下一些证据。当我远程访问这些服务器并在本地运行脚本时,会生成这些文件,但是按照上面的脚本进行操作是行不通的。

如有任何帮助,我们将不胜感激。

最佳答案

如果您可以在服务器上启用 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
}

关于windows - 安排 Powershell 和批处理作业同步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089966/

相关文章:

windows - 使用 CMake 将 Qt DLL 复制到 Windows 上的可执行目录

c# - 从 Powershell 脚本获取输出

c# - 可以通过批处理文件以编程方式删除和添加对 csproj 的引用吗?

Python 2 CSV 编写器在 Windows 上产生错误的行终止符

linux - "ls -Rl * > file.dat"的 Windows 命令

windows - 使用 Ansible 在 Windows 上执行 .exe

powershell - 在Powershell控制台和ISE中从脚本目录中点源文件?

Powershell:解析可能不存在的路径?

windows - 查找 "- "是否在目录名称中(批处理)

windows - 将 Windows 批处理文件变量设置为星期几