如何从JSON对象中移除条目并保存移除项至独立JSON文件?
解决PowerShell 5.1中移除JSON元素并保存移除条目的问题
嘿,看你的需求是要从JSON里移除那些Closing日期早于今天的条目,同时把这些被移除的内容单独存成一个新的JSON文件对吧?我帮你梳理下现有代码的问题,再给出完整的解决方案:
先说说你现有代码里的几个小问题:
$entry = Get-Content $path | ConvertFrom-Json $entry这行重复赋值了,而且变量名用单数不太合适(毕竟JSON应该是条目数组)- 没有专门收集要移除的条目,也没对原数据做过滤处理
- 日期转换的步骤有点繁琐,还可能受系统区域设置影响
调整后的完整代码
# 1. 读取目标JSON文件,转换为PowerShell对象数组 $sourceJsonPath = "A:\path\to\file.json" $allEntries = Get-Content $sourceJsonPath -Raw | ConvertFrom-Json # 2. 获取今天的日期(只保留日期部分,忽略时间,避免比较出错) $today = (Get-Date).Date # 3. 分别收集要保留和要移除的条目 $removedEntries = @() $remainingEntries = @() foreach ($entry in $allEntries) { # 将Closing字段的字符串日期转为DateTime对象,用InvariantCulture避免区域设置干扰 $closingDate = [datetime]::ParseExact($entry.Closing, "MM/dd/yyyy", [System.Globalization.CultureInfo]::InvariantCulture) if ($today -gt $closingDate) { $removedEntries += $entry Write-Host "已标记移除:Closing日期为 $($entry.Closing)" } else { $remainingEntries += $entry } } # 4. 将保留的条目写回原JSON文件 $remainingEntries | ConvertTo-Json -Depth 10 | Set-Content $sourceJsonPath -Force # 5. 将移除的条目保存为独立的JSON文件 $removedJsonPath = "A:\path\to\removed_entries.json" if ($removedEntries.Count -gt 0) { $removedEntries | ConvertTo-Json -Depth 10 | Set-Content $removedJsonPath -Force Write-Host "搞定!$($removedEntries.Count) 条过期条目已保存到 $removedJsonPath" } else { Write-Host "没有找到需要移除的过期条目~" }
几个关键细节解释:
- 用
-Raw读取JSON:确保ConvertFrom-Json能正确解析整个JSON结构,尤其是当JSON是数组的时候 (Get-Date).Date:只取今天的日期部分,去掉时分秒,这样和Closing的日期比较更准确InvariantCulture解析日期:避免你的系统区域设置(比如非英文系统)导致日期解析失败ConvertTo-Json -Depth 10:PowerShell 5.1默认的序列化深度只有2,如果你的JSON有嵌套对象,不加这个参数会丢失数据- 分开收集保留/移除条目:直接遍历筛选比在原数组里删除更安全,也更容易跟踪结果
如果你的JSON结构不是直接的条目数组,而是嵌套在某个属性里(比如{ "JobList": [ ... ] }),只需要把代码里的$allEntries改成$allEntries.JobList,写回原文件的时候对应调整成@{ JobList = $remainingEntries } | ConvertTo-Json ...就可以啦。
内容的提问来源于stack exchange,提问作者GettingStarted
相关产品推荐
相关产品推荐

