因此,我使用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
必须在所有计算机上收集所有输出,然后才能显示结果。