PowerShell筛选对象集合freeGBonC属性小于指定值结果异常问题
异常原因
freeGBonC字段为字符串类型而非数值类型,且使用逗号作为小数点分隔符- PowerShell中字符串与整数比较时,会自动将整数转为字符串后按字符编码逐位比较:整数6会被转为字符串
"6",所有freeGBonC的首字符为1、2、3,编码值均小于"6",因此所有行都满足-lt 6的条件,-gt 6自然无匹配结果。
修复方法
筛选前先将freeGBonC转换为数值类型即可正常比较:
- 系统区域默认支持逗号作为小数点时,直接转换即可:
$res | Where-Object { [double]$_.freeGBonC -lt 6 }
- 系统区域不识别逗号作为小数点时,显式指定兼容逗号小数点的区域完成转换:
$res | Where-Object { [double]::Parse($_.freeGBonC, [Globalization.CultureInfo]'de-DE') -lt 6 }
如果$res是从CSV文件导入生成的,也可以在导入阶段直接完成类型转换,避免后续每次操作都重复处理:
$res = Import-Csv .\你的存储文件路径.csv | ForEach-Object { $_.freeGBonC = [double]::Parse($_.freeGBonC, [Globalization.CultureInfo]'de-DE') $_ }
内容的提问来源于stack exchange,提问作者McVitas
相关产品推荐
相关产品推荐

