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

我有4个服务器,我需要做一些处理。 处理分两部分:

  1. 运行一个batch file
  2. 运行一个powershell脚本

我需要在所有服务器上同时运行batch file,理想情况是同时运行。 我目前在所有的服务器上设置了计划任务,因为我们使用networking时间服务,所以它们是同步的。

然后我需要一个接一个地运行Powershell脚本,也就是说,当Server1上的脚本完成时,Server2上的脚本开始,然后当它结束时,Server3开始等。这可以按照与第1部分相同的方式完成,即计划任务,但是这些任务需要大量不同的时间来完成。

我想避免batch file的计划任务选项,即使时间同步,我宁愿让他们从一个地方开始。 最后,我需要关于如何在不同服务器之间以类似队列的方式调用Powershell脚本的build议。 这可能吗?

编辑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 }