PowerShell根据desktops.txt匹配规则修改CSV文件Wifi字段值的方法
原代码存在的问题
- 判断条件永远不成立:
Select-String返回的是匹配结果对象而非布尔值$True,因此$SEL -eq $True的判断永远为假,修改逻辑从未触发。 - 循环逻辑错误覆盖结果:外层循环遍历设备名单时,每次都基于原始CSV重新生成
$NewCSV,前几次遍历的修改结果会被后一次完全覆盖,最终只有最后一个设备(machine5)的遍历结果生效,而machine5不存在于CSV中,自然无修改。 - 大小写匹配隐患:CSV中
Machine字段值为Machine1(首字母大写),设备名单中为machine1(全小写),如果开启严格大小写匹配会导致匹配失败。 - 逻辑冗余低效:每次循环都重复读取
desktops.txt查询、重复遍历全量CSV,无意义消耗性能。
修正后的可运行代码
# 预加载设备名单,统一转为小写避免大小写匹配问题 $desktopList = (Get-Content .\desktops.txt).ToLower() # 读取源CSV文件 $ImportedCSV = Import-CSV data.csv # 单次遍历所有CSV行完成修改 $NewCSV = Foreach ($Entry in $ImportedCsv) { if ($desktopList.Contains($Entry.Machine.Trim().ToLower()) -and $Entry.Wifi -eq 'Connected') { $Entry.Wifi = 'Connected*' } $Entry } # 导出结果,指定UTF8编码避免乱码 $NewCSV | Export-CSV data2.csv -NoTypeInformation -Encoding UTF8
输出结果验证
运行后生成的data2.csv完全符合预期:
Name,Machine,Model,Wifi User1,Machine1,Dell Lattitude,Connected* User2,Machine2,Dell Lattitude,disconnected User3,Machine3,Dell Lattitude,Connected
内容的提问来源于stack exchange,提问作者Johnny Cakes
相关产品推荐
相关产品推荐

