PowerShell脚本问题:TXT与CSV对象名匹配失败排查
问题分析与解决
你的脚本出现全量「不存在」提示,核心是两个关键问题:
1. CSV列名匹配错误
你的CSV列标题是**「Object Name」**(带空格),但代码里用的是$_.objectname(无空格、全小写)。Import-Csv会严格保留CSV的列名格式(包括空格和大小写),这导致你永远匹配不到任何条目。正确的属性引用应该是$_.'Object Name'(用单引号包裹带空格的列名)。
2. 存在标记未循环重置
$exists = $false写在foreach循环外面,会导致第一次循环如果找到匹配,后续所有循环的$exists都会保持true,逻辑彻底混乱。必须把这个变量的初始化放到循环内部,每次遍历新对象时都重置标记。
修正后的完整脚本(含更新/新增逻辑)
$listFile = Get-Content "\\File Path\Test List.txt" $csvFile = Import-Csv -Path '\\File Path\Test Report.csv' $Now = [datetime]::Now foreach($object in $listFile) { # 每次循环重置存在标记 $exists = $false # 用正确的列名匹配条目 $matchedItem = $csvFile | Where-Object { $_.'Object Name' -eq $object } if($matchedItem) { $exists = $true Write-Host "$object exists in CSV file!" # 更新指定列:次数+1,更新最后标记时间 $matchedItem.'Times Flagged' = [int]$matchedItem.'Times Flagged' + 1 $matchedItem.'Date Last Flagged' = $Now.ToString('yyyy-MM-dd HH:mm:ss') } else { Write-Host "$object does not exist in CSV file!" # 新增对象条目:初始化指定列,Notes留空 $newItem = [PSCustomObject]@{ 'Object Name' = $object 'Times Flagged' = 1 'Date Last Flagged' = $Now.ToString('yyyy-MM-dd HH:mm:ss') 'Notes' = '' } $csvFile += $newItem } } # 将更新后的内容写回CSV文件 $csvFile | Export-Csv -Path '\\File Path\Test Report.csv' -NoTypeInformation -Encoding UTF8
额外注意事项
- 若不确定CSV列名格式,可先运行
$csvFile | Get-Member查看所有属性名,确保完全匹配。 - 处理
Times Flagged时要转成int类型,避免字符串拼接导致的错误(比如原数值是"2",直接+1会变成"21")。 - 导出CSV时用
-Encoding UTF8避免中文乱码,-NoTypeInformation去掉PowerShell默认的类型注释行。
内容的提问来源于stack exchange,提问作者RustyAndroid
相关产品推荐
相关产品推荐

