PowerShell foreach循环远程获取进程无结果问题
遍历服务器列表执行Invoke-Command时进程结果不显示的解决方法
问题场景
登录每台服务器拉取进程信息,单独查询单台服务器时能正常输出进程结果,但使用ForEach-Object遍历服务器列表执行时,进程结果未显示。
相关代码
$serverListFile = "servers.csv" $global:ServerLists = Import-Csv -Path $global:ScriptPath\$ServerListFile -Delimiter "," | ForEach-Object { $_.servers $currentServer = $_.servers Write-Host $currentServer Write-Host "Getting first 5 Processes on" $currentServer Invoke-Command -ComputerName $_.servers -Credential $Cred -ScriptBlock { Get-Process | Select-Object -First 5 } }
执行结果
Server1 Getting first 5 Processes on Server1 Server2 Getting first 5 Processes on Server2 Server3 Getting first 5 Processes on Server3
问题原因
代码中ForEach-Object块开头的$_.servers是多余的,它会将当前服务器名称输出到管道,抢占了Invoke-Command返回的进程对象的输出位置,导致进程结果无法显示。同时,将ForEach-Object的结果赋值给全局变量时,Write-Host的控制台输出和管道输出的优先级问题也会干扰进程结果的呈现。
解决方案
方案1:保存结果并显示
修改代码,移除多余的$_.servers,显式收集并显示进程结果:
$serverListFile = "servers.csv" $global:ServerLists = Import-Csv -Path $global:ScriptPath\$ServerListFile -Delimiter "," | ForEach-Object { $currentServer = $_.servers Write-Host "`nGetting first 5 Processes on $currentServer" -ForegroundColor Cyan # 执行远程命令并获取进程结果 $processes = Invoke-Command -ComputerName $currentServer -Credential $Cred -ScriptBlock { Get-Process | Select-Object -First 5 } # 将结果输出到控制台 $processes | Out-Host # 将结果存入全局变量 $processes }
方案2:仅显示结果(不保存)
如果不需要将结果存入全局变量,简化代码如下:
$serverListFile = "servers.csv" Import-Csv -Path $global:ScriptPath\$ServerListFile -Delimiter "," | ForEach-Object { $currentServer = $_.servers Write-Host "`nGetting first 5 Processes on $currentServer" -ForegroundColor Cyan # 直接输出进程结果到控制台 Invoke-Command -ComputerName $currentServer -Credential $Cred -ScriptBlock { Get-Process | Select-Object -First 5 } | Out-Host }
说明
单独查询单台服务器时正常,是因为没有ForEach-Object中多余的$_.servers输出干扰,Invoke-Command的结果能直接输出到控制台。修改后通过移除干扰输出、显式控制结果的显示/存储,就能解决遍历列表时进程结果不显示的问题。
内容的提问来源于stack exchange,提问作者dcwilli5
相关产品推荐
相关产品推荐

