如何用PowerShell筛选CSV中指定BuildNumber的计算机名并导出
PowerShell CSV筛选问题修复方案
原代码问题分析
你的代码存在两个核心问题,导致筛选逻辑完全失效:
- 循环中错误引用了集合变量
$computers而非当前迭代项$computer,判断条件实际在和整个集合的所有BuildNumber值做对比,逻辑混乱 - 没有收集符合筛选条件的项,最后直接输出整个集合的
PSComputerName,自然会导出所有计算机名
修复方案(两种写法)
写法一:PowerShell管道式筛选(推荐,简洁高效)
直接用Where-Object完成筛选,一步生成符合要求的CSV文件:
Import-Csv "c:\scripts\os.csv" | Where-Object { $_.BuildNumber -ne "19045" } | Select-Object -Property PSComputerName | Export-Csv "c:\scripts\noncompliant.csv" -NoTypeInformation
Where-Object:精准筛选BuildNumber不等于19045的行Select-Object:只保留需要的PSComputerName列-NoTypeInformation:避免生成多余的类型注释行,保证CSV格式纯净,方便其他脚本读取
写法二:修复原foreach循环逻辑
如果你更习惯用循环写法,修正后的代码如下:
$computers = Import-Csv "c:\scripts\os.csv" $nonCompliant = @() # 初始化空数组存储符合条件的计算机名 foreach ($computer in $computers) { # 引用当前迭代的单个对象$computer,而非整个集合$computers if ($computer.BuildNumber -ne "19045") { $nonCompliant += $computer.PSComputerName } } # 将收集到的结果转换为带列名的对象,再导出为标准CSV $nonCompliant | Select-Object @{Name='PSComputerName'; Expression={$_}} | Export-Csv "c:\scripts\noncompliant.csv" -NoTypeInformation
注意事项
Import-Csv默认将所有列解析为字符串类型,所以直接和字符串"19045"对比即可,无需转换类型- 务必使用
Export-Csv而非Out-File,后者生成的是纯文本文件,不是标准CSV格式,会导致其他脚本读取异常
内容的提问来源于stack exchange,提问作者PCMedicJAX
相关产品推荐
相关产品推荐

