我有 4 台服务器需要进行一些处理。处理分为两部分:
- 运行批处理文件
- 运行 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
脚本,使其在运行时输出两个文件(stderr 和 stdout),以便留下一些证据。当我远程到这些服务器并在本地运行脚本时,会生成这些文件,但是按照上面的脚本执行它是行不通的。
任何帮助,将不胜感激。