PowerShell过滤JSON数据时符合阈值的预期条目未返回问题
问题原因
- 你的JSON文件中所有数值字段都被双引号包裹,
ConvertFrom-Json解析后,Workspace Usage字段的类型为字符串,而非数值类型。 - 你在筛选时把比较值
75也加了双引号,触发的是字符串按字符顺序比较,而非数值大小比较:- 字符串
"108.9413"和"75"比较时,第一个字符'1'的ASCII码小于'7',因此整体被判定为小于"75",不符合筛选条件 - 字符串
"81.2462"首字符'8'大于'7'、"78.5773"首字符等于'7'且第二位'8'大于'5',因此这两个条目被保留
- 字符串
解决方法
方法1:筛选时临时转换字段类型
只需要在Where-Object判断时把Workspace Usage转成数值类型,同时去掉比较值75的双引号即可,修改后代码如下:
$variable = Get-Content "export.json" | ConvertFrom-Json $logs = $variable | Where-Object { [double]$_.'Workspace Usage' -ge 75 } Write-Output $logs
方法2:解析后统一转换所有数值字段类型
如果后续还需要对其他数值字段做计算,可以在解析JSON后统一把对应字段转成数值类型,避免后续重复转换:
$variable = Get-Content "export.json" | ConvertFrom-Json | ForEach-Object { $_.'Workspace Allowance' = [double]$_.'Workspace Allowance' $_.'Workspace Usage' = [double]$_.'Workspace Usage' $_.'Workspace Size Free' = [double]$_.'Workspace Size Free' $_.'Percentage Utilization' = [double]$_.'Percentage Utilization' $_.'Predicted Usage' = [double]$_.'Predicted Usage' $_ } $logs = $variable | Where-Object { $_.'Workspace Usage' -ge 75 } Write-Output $logs
内容的提问来源于stack exchange,提问作者Siddhartha Das
相关产品推荐
相关产品推荐

