PowerShell批量查询服务器CIM信息重复返回本地数据故障求助
问题根因
- 核心错误:调用
Get-CimInstance时未添加-ComputerName $server参数,每次查询默认指向本地服务器,因此循环多少次就返回多少条重复的本地数据 - 服务器列表读取错误:你将仅含Name列的CSV导出为TXT文件的操作完全多余,导出的TXT会自带CSV表头
"Name",且所有服务器名被引号包裹,后续Get-Content读取时会把表头也当做服务器名,带引号的服务器名也会导致CIM连接失败 - 全局静默错误配置会掩盖连接失败、服务器名无效等异常,无法定位问题
修正后的代码
$ErrorActionPreference = 'Stop' $importpath = "c:\directory1" $workingpath = "c:\directory2" # 直接从原始CSV过滤取服务器名,无需生成多个中间文件 $servers = Import-CSV -Path "$importpath\somefile.csv" | Where-Object { $_.Powerstate -ne "PoweredOff" -and $_.Guest -notlike "*somestring*" } | Select-Object -ExpandProperty Name $results = foreach ($server in $servers) { try { # 指定要查询的目标服务器,追加ServerName字段方便对应结果 Get-CimInstance -ClassName win32_OperatingSystem -ComputerName $server | Select-Object @{Name = 'ServerName'; Expression = { $server } }, * } catch { # 记录查询失败的服务器和错误信息 [PSCustomObject]@{ ServerName = $server Status = "查询失败:$($_.Exception.Message)" } } } $results | Export-Csv -Path "$workingPath\PRODUCTIONRESULTS.csv" -NoTypeInformation
优化建议
- 去掉冗余的中间文件生成步骤,直接从原始CSV读取数据处理,减少不必要的磁盘IO
- 按需指定
Select-Object返回的属性,不需要全量返回所有属性,可以大幅提升查询和导出效率 - 保留错误捕获逻辑,后续可以直接从结果CSV里筛选出查询失败的服务器批量重试
内容的提问来源于stack exchange,提问作者Yukaputz Mike
相关产品推荐
相关产品推荐

