PowerShell脚本导入CSV数据非字符串字段全为0,求排查
问题排查与修复方案
核心错误点
- 错误的类型强制转换:把计算机名、IP地址这类字符串字段强行转成
[int],非数字内容转整数失败后默认返回0,这就是计算机名显示0的原因;IP地址带小数点,根本无法转成整数,同样会返回0。 - 日期类型语法错误:日期转换时用了不存在的
[LastReportedStatusDate]类型,应该用PowerShell内置的[DateTime]。 - 列名不匹配问题:转字符串后字段空白,大概率是脚本里引用的CSV列名和实际文件里的列名不一致(比如CSV里是
Computer Name,但脚本里写的$_.ComputerName)。
修复后的脚本
# SU tile $data = Import-Csv -Path "C:\Temp\file.csv" -Delimiter ',' $data | Select-Object @{ Name = "Domain"; Expression ={ [string]$_.Domain } }, @{ Name = "Name"; Expression ={ [string]$_.Name } }, @{ Name = "Computer Name"; Expression ={ [string]$_.ComputerName } # 计算机名是字符串,禁止转int }, @{ Name = "IP Address"; Expression ={ [string]$_.IPAddress } # IP地址是字符串,禁止转int }, @{ Name = "Approved Updates Installed"; Expression ={ # 先验证是否为纯数字,避免转换失败返回0 if ($_.ApprovedUpdatesInstalled -match '^\d+$') { [int]$_.ApprovedUpdatesInstalled } else { $_.ApprovedUpdatesInstalled } # 保留原始内容,或按需调整 } }, @{ Name = "Last Reported Status Date"; Expression ={ # 使用正确的DateTime类型解析日期 [DateTime]::ParseExact($_.LastReportedStatusDate, 'dd/MM/yyyy', [Globalization.CultureInfo]::CreateSpecificCulture('en-GB')) } }, @{ Name = "Make"; Expression ={ [string]$_.Make } } | ConvertTo-Json # 需要转JSON时添加此管道
额外检查项
- 核对CSV列名:打开CSV文件,确认实际列名和脚本里的
$_.XXX完全匹配(大小写不影响,但空格、拼写必须一致)。 - 日期容错处理:如果CSV里日期格式不统一,ParseExact会报错,可改用TryParse容错:
Expression ={ $date = $null if ([DateTime]::TryParse($_.LastReportedStatusDate, [Globalization.CultureInfo]::CreateSpecificCulture('en-GB'), [Globalization.DateTimeStyles]::None, [ref]$date)) { $date } else { $_.LastReportedStatusDate # 转换失败时保留原始值 } }
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

