在多台服务器上运行一个脚本,但结果不正常



因此,我使用invoke命令同时针对多个服务器运行脚本:

Invoke-Command -ComputerName $Servers -Credential $Cred -FilePath "C:RemoteScript.ps1"

然而,结果似乎不正常:

用户:用户名FQDN:DEVSERVER01.localnet.intIP:10.0.0.101

Server uptime: 20 days
======================
User: username
FQDN: DEVSERVER02.localnet.int
IP: 10.0.0.202
Server uptime: 20 days
======================
User: username
FQDN: DEVSERVER03.localnet.int
IP: 10.0.0.303
Server uptime: 20 days
======================
List of updates for DEVSERVER01.localnet.int:
No updates
List of updates for DEVSERVER02.localnet.int:
No updates
List of updates for DEVSERVER03.localnet.int:
No updates

我也想记录每台服务器的结果,但这就是我想到的:

Start-Process -FilePath Powershell -ArgumentList "
Invoke-Command -ComputerName $Server -Credential $Cred -FilePath "C:RemoteScript.ps1"
" -RedirectStandardOutput "$Server Log.txt" -Wait

我应该如何在两台服务器上运行脚本,但应该尝试按顺序从每台服务器获得结果?

事实上,当以Invoke-Command并行的多台计算机为目标时,计算机间输出对象的顺序是不可保证的。

您可以使用Group-Object根据输出对象的(隐式添加的(PSComputerName属性对其进行分组,该属性反映了原始计算机:

Invoke-Command -ComputerName $Servers -Credential $Cred -FilePath C:RemoteScript.ps1 |
Group-Object PSComputerName |
ForEach-Object { Set-Content "$($_.Name) Log.txt" -Value $_.Group }

请注意,Group-Object隐式且不变地输出按分组标准/a排序的组,因此在这种情况下,组按计算机名称排序。

注意事项:在您的情况下,考虑到您正在将结果写入文件,您无论如何都不希望控制台输出,但如果您确实想在控制台中查看结果,请注意,Group-Object必须在所有计算机上收集所有输出,然后才能显示结果。

最新更新