PowerShell管道调用Select-Object仅返回第一个变量数据如何解决
问题原因
这是PowerShell默认控制台输出格式化的机制导致的:
- 第一条
$final | select ...输出的对象包含pscomputername、name、startmode、state四个属性,PowerShell会根据第一个输出对象的属性结构,确定全局的输出表格表头,后续输出的对象如果属性结构和首个对象不匹配,就会被默认格式化逻辑过滤,不会在控制台展示。 - 你第二条
$failed_servers | select ...输出的对象仅包含Failed Servers单个属性,和前面的结构不匹配,因此没有显示。 Out-GridView(ogv)每次调用都会开启独立的渲染窗口,不受全局格式化逻辑影响,因此两个输出都能正常弹出。- 你去掉
$failed_servers后的select语句时,输出的是纯字符串数组,PowerShell对纯字符串类型有单独的兼容渲染逻辑,因此可以正常显示,但格式不符合预期。
解决方案
方案1:强制每次输出独立渲染(推荐,改动最小)
在每条输出语句末尾加Out-Host,强制将当前结果直接提交给控制台宿主单独渲染,不受前面输出的格式影响:
$final|select pscomputername, name, startmode, state |where {$_.pscomputername -ne $null} | Out-Host $failed_servers |select @{N='Failed Servers'; E={$_}} | Out-Host
方案2:分开展示并加格式标识
如果需要更清晰的展示效果,可以加分隔提示,并用Format-Table强制指定每个输出的格式:
Write-Host "`n==================== 查询成功的服务列表 ====================" $final|select pscomputername, name, startmode, state |where {$_.pscomputername -ne $null} | Format-Table -AutoSize Write-Host "`n==================== 连接失败的服务器列表 ====================" $failed_servers |select @{N='Failed Servers'; E={$_}} | Format-Table -AutoSize
可选优化:消除控制台"access is denied"报错
你可以在gwmi命令末尾加2>$null,将WMI返回的标准错误流重定向为空,不会影响你的错误捕获逻辑:
gwmi -query "select * from win32_service where name like '%SQLSERVER%'" -cn $server_instance -ErrorVariable +errors -ErrorAction SilentlyContinue 2>$null
内容的提问来源于stack exchange,提问作者mbourgon
相关产品推荐
相关产品推荐

