PowerShell脚本筛选CSV格式Excel数据运行报错如何解决
问题背景
需要通过PowerShell脚本实现CSV格式的Excel导出数据筛选,现有脚本运行时报类型转换错误,无法输出预期筛选结果。
原错误脚本如下:
Import-Csv -Path "D:\Excel\Data\List.csv" -Header "EventID", "TimeCreated", "Computer", "TargetUserName", "SubjectUserName", "HOSTName", "Filename" | Where-Object {[INT]$_.TargetUserName -eq 122388} | Select-Object "EventID", "TimeCreated", "Computer", "TargetUserName", "SubjectUserName", "HOSTName", "Filename" | Export-Csv "D:\Excel\test.csv" -NoTypeInformation
参考材料:
报错根因
-Header参数滥用:绝大多数从Excel导出的CSV第一行自带列名表头,此时加-Header参数会让PowerShell把原表头行识别为第一行有效数据,该行的TargetUserName字段值是字符串TargetUserName,直接强转[INT]会触发“输入字符串格式不正确”的报错。- 类型转换无容错:
TargetUserName列本身可能存在空值、非数字格式的普通用户名,直接强制转整数会在遇到这类值时直接抛出错误,中断脚本执行。
正确实现代码
# 注意:如果你的CSV第一行自带列名,不要加-Header参数;仅当CSV无表头、首行就是数据时才保留-Header配置 Import-Csv -Path "D:\Excel\Data\List.csv" | Where-Object { # 增加类型转换容错,无法转为整数的条目直接判定为不匹配,不会触发报错 $matchId = 0 [int]::TryParse($_.TargetUserName, [ref]$matchId) -and $matchId -eq 122388 } | Select-Object "EventID", "TimeCreated", "Computer", "TargetUserName", "SubjectUserName", "HOSTName", "Filename" | Export-Csv "D:\Excel\test.csv" -NoTypeInformation -Encoding UTF8
注意事项
- 导出命令增加
-Encoding UTF8参数,避免生成的CSV文件用Excel打开时出现中文乱码。 - 如果确认你的CSV文件没有表头、第一行开始就是纯数据,只需要在
Import-Csv后补回原来的-Header参数即可,其余逻辑不需要修改。 - 筛选逻辑用
[int]::TryParse做预判断,兼容列内存在非数字值、空值的场景,不会因为个别异常值导致整个脚本运行失败。
内容的提问来源于stack exchange,提问作者Arunkumar
相关产品推荐
相关产品推荐



