PowerShell查询服务器Chrome版本导出CSV异常问题排查
问题
我需要批量查询多台服务器的以下信息:
- 是否已安装Chrome
- 已安装的Chrome版本
通过查询c:\program files (x86)\Google\Chrome\Application目录获取版本文件夹,部分服务器仅有1个版本文件夹,多数有2个及以上。
屏幕输出结果正常,但导出为CSV文件时,已安装Chrome的服务器版本列显示为System.Object[],未安装的则显示正常。请问问题出在哪里?
相关代码
$list = [System.Collections.Generic.List[PSObject]]@() foreach($server in Get-Content d:\chkchromever\servers.txt) { If(Test-Path \\$server\c$\Program Files (x86)\Google\Chrome\Application) { # Chrome Path Exists- $VersionNumber=(Get-ChildItem -Path \\$server\c$\Program Files (x86)\Google\Chrome\Application|where {$_.name -match "\d\d.*"}).Name Write-Host $server','$VersionNumber $obj= [pscustomobject]@{ Server=$server Version=$VersionNumber } $List.Add($obj); $list | Export-Csv -Path "D:\chkchromever\output.csv " } else { Write-Host $server "does not have Chrome" $obj= [pscustomobject]@{ Server=$server Version= "Not Installed" } $List.Add($obj); $list | Export-Csv -Path "D:\chkchromever\output.csv" } }
执行现象
PowerShell控制台输出
PS C:\Windows\system32> D:\chkchromever\chkversion2.ps1 Server1,76.0.3809.132 86.0.4240.198 Server2,106.0.5249.103 106.0.5249.119 Server3 does not have Chrome Server4 does not have Chrome
CSV文件内容
#TYPE System.Management.Automation.PSCustomObject Server Version Server1 System.Object[] server2 System.Object[] server3 Not Installed
原因与解决方法
问题原因
$VersionNumber是数组对象(当存在多个版本文件夹时),CSV无法直接序列化数组类型,因此显示System.Object[]。控制台输出时PowerShell会自动将数组展开为空格分隔的字符串,但Export-Csv不会做这个处理。
另外,循环内重复执行Export-Csv属于冗余操作,会多次覆盖文件,影响效率。
修正方案
- 将数组类型的版本号转换为字符串(用逗号/空格分隔)
- 把CSV导出操作移到循环结束后,一次性完成写入
修正后的代码
$list = [System.Collections.Generic.List[PSObject]]@() $servers = Get-Content d:\chkchromever\servers.txt foreach($server in $servers) { $chromePath = "\\$server\c$\Program Files (x86)\Google\Chrome\Application" if(Test-Path $chromePath) { # 获取版本文件夹名称并转为逗号分隔的字符串 $VersionNumber = (Get-ChildItem -Path $chromePath | Where-Object {$_.Name -match "\d{2,}.*"}).Name -join ", " Write-Host "$server, $VersionNumber" $obj = [pscustomobject]@{ Server = $server Version = $VersionNumber } $List.Add($obj) } else { Write-Host "$server does not have Chrome" $obj = [pscustomobject]@{ Server = $server Version = "Not Installed" } $List.Add($obj) } } # 循环结束后一次性导出CSV,添加-NoTypeInformation去除冗余类型行 $list | Export-Csv -Path "D:\chkchromever\output.csv" -NoTypeInformation -Encoding UTF8
关键优化说明
- 使用
-join ", "将版本数组转为字符串,CSV中会显示为76.0.3809.132, 86.0.4240.198格式 - 添加
-NoTypeInformation参数去掉CSV开头的#TYPE行,输出更简洁 - 导出操作移到循环外,避免重复写入文件,提升执行效率
- 用变量存储
$chromePath,减少重复代码,提高可读性
内容的提问来源于stack exchange,提问作者A A Ron
相关产品推荐
相关产品推荐

