PowerShell修改JSON节点值时文件被清空的问题求助
问题修复方案
原脚本存在几个关键错误,导致修改失败甚至清空JSON文件,下面是修正后的完整代码及错误说明:
修正后的PowerShell脚本
$TestPath = '.\test.json' [bool]$TP = Test-Path -Path $TestPath -PathType Leaf IF ($TP) { # 读取并解析JSON文件,$Content为解析后的对象 $Content = Get-Content $TestPath | ConvertFrom-Json # 直接获取Config节点下的first值,无需转数组 $FirstOpen = $Content.Config.first # 匹配JSON里的字符串值"$True" if ($FirstOpen -eq '$True') { Write-Warning "Show disclaimer !" # 修改$Content对象的属性,这才会影响后续序列化内容 $Content.Config.first = '$False' # 将修改后的对象重新序列化为JSON并写入文件 $Content | ConvertTo-Json -Depth 10 | Set-Content $TestPath -Encoding utf-8 } ELSE { Write-Host "This file has already been opened for the first time !" } } ELSE { Write-Host "The config file not exist.🛑" Start-Sleep -s 5 exit } pause
原脚本错误说明
- 未定义
$Data变量:原脚本使用$Data.Config.First,但从未定义$Data,应替换为解析JSON后的$Content对象。 $FirstOpen定义冗余:@($Data.Config.First)把值转成数组完全没必要,直接取$Content.Config.first即可。- 修改对象方式错误:原代码试图修改
$FirstOpen的属性,但$FirstOpen只是字符串值的副本,修改它不会影响原JSON对象。必须直接修改$Content对象的属性,后续序列化时才会写入修改后的内容。 - 判断条件大小写不匹配:JSON里的
first值是"$True",原脚本判断-eq '$true'(小写)会匹配失败,需改成'$True'或用不区分大小写的-ieq '$true'。 - 序列化深度隐患:
ConvertTo-Json默认深度为2,添加-Depth 10可避免嵌套层级较深时的内容截断问题。
内容的提问来源于stack exchange,提问作者sylvain gagnon
相关产品推荐
相关产品推荐

