PowerShell导出多显示器信息至Excel异常,如何处理多行输出?
解决多显示器场景下PowerShell导出CSV的格式问题
问题原因
当目标机器连接多台显示器时,$details会变成数组类型,而Export-Csv无法直接序列化数组,导致Excel中对应单元格显示System.Object[]。以下是两种符合你需求的解决方案:
方案1:将多显示器结果合并到同一单元格(带换行)
把数组中的多个值用换行符连接成单个字符串,导出后在Excel中开启单元格自动换行即可正常显示。
修改后的脚本:
Get-Content C:\temp\hostnames.txt | ForEach-Object { $computerName = $_ # 远程获取显示器连接参数,提取VideoOutputTechnology并合并为带换行的字符串 $details = Invoke-Command -ComputerName $computerName -ScriptBlock { Get-WmiObject WmiMonitorConnectionParams -Namespace root\wmi -ErrorAction SilentlyContinue | ForEach-Object { $_.VideoOutputTechnology } } $displayType = if ($details) { # 用Windows换行符`r`n连接数组元素,Excel识别后可换行 $details -join "`r`n" } else { 'Unavailable' } # 创建输出对象 [PSCustomObject]@{ ComputerName = $computerName DisplayType = $displayType } } | Sort-Object ComputerName | Export-Csv C:\temp\Monitor_Report.csv -NoTypeInformation
后续操作
打开导出的CSV文件后,选中DisplayType列,在Excel中开启自动换行(开始选项卡→对齐方式→自动换行),即可看到每个显示器结果单独换行显示。
方案2:每个显示器结果单独占一行,机器名仅显示一次
将每个显示器信息拆分为单独行,仅第一行显示机器名,后续行留空,适合需要逐行查看单台机器多显示器的场景。
修改后的脚本:
Get-Content C:\temp\hostnames.txt | ForEach-Object { $computerName = $_ $details = Invoke-Command -ComputerName $computerName -ScriptBlock { Get-WmiObject WmiMonitorConnectionParams -Namespace root\wmi -ErrorAction SilentlyContinue | ForEach-Object { $_.VideoOutputTechnology } } if ($details) { # 循环每个显示器结果,仅第一个对象保留机器名 foreach ($index in 0..($details.Count - 1)) { [PSCustomObject]@{ ComputerName = if ($index -eq 0) { $computerName } else { '' } DisplayType = $details[$index] } } } else { # 无结果时输出Unavailable [PSCustomObject]@{ ComputerName = $computerName DisplayType = 'Unavailable' } } } | Sort-Object ComputerName | Export-Csv C:\temp\Monitor_Report.csv -NoTypeInformation
效果说明
导出后,单台机器的多个显示器结果会依次占行,只有第一行显示机器名,后续同机器的行ComputerName列为空,方便按机器分组查看。
额外优化建议
- 推荐使用
[PSCustomObject]替代New-Object PsObject,语法更简洁且性能更好。 - 可以给
VideoOutputTechnology的数值添加友好映射(比如10对应DisplayPort),提升可读性:$displayMap = @{ 0 = 'VGA' 1 = 'S-Video' 10 = 'DisplayPort' # 可补充其他映射值,参考微软官方文档 } # 使用时替换为:$displayMap[$details[$index]] ?? $details[$index]
内容的提问来源于stack exchange,提问作者SynisterSyclone
相关产品推荐
相关产品推荐

