PowerShell读取CSV文件列值时无法获取正确结果如何解决
问题原因
你遇到的输出异常是PowerShell双引号变量展开规则导致的:双引号内默认仅展开变量本身,不会自动解析动态属性访问逻辑,$row.$col 在双引号中会被拆分为 $row 的字符串转写结果 + . + $col 的值,因此输出了@{...}.accountant这类不符合预期的内容。
注意:你提供的CSV示例存在两个小问题,建议先修正避免解析异常:
- 表头列名存在多余前后空格,会导致生成的属性名带空格,访问不便
- 第二行值的数量比表头多1个,末尾多余逗号会导致Import-Csv生成额外的空列
修正后可直接使用标准格式CSV:roles,admin,accountant,security Engineer,,x,
修正方案
动态访问对象属性的正确写法为:双引号内使用子表达式$()包裹属性访问逻辑,强制PowerShell先计算表达式结果再插入字符串。
修正后完整代码
$path = "$PSScriptRoot\Test.csv" $csv = Import-Csv -Path $path -Delimiter "," # 可选:自动修剪所有列名的前后空白,兼容表头带空格的CSV $csv | Get-Member -MemberType NoteProperty | ForEach-Object { $oldName = $_.Name $newName = $oldName.Trim() if ($oldName -ne $newName) { $csv | Rename-Item -MemberType NoteProperty -OldName $oldName -NewName $newName -Force } } $columns = $csv | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name $csv | ForEach-Object { $row = $_ foreach ($col in $columns) { Write-Host "value of column is : $col " # 用子表达式包裹动态属性访问,正确读取单元格值 Write-Host "value of cell is : $($row.$col) " Start-Sleep -Seconds 10 } }
验证效果
执行上述代码后,遍历到accountant列时会正确输出对应的值x,其余任意列都可以正常读取对应单元格内容。
内容的提问来源于stack exchange,提问作者Joe_12345
相关产品推荐
相关产品推荐

