使用PowerShell更新JSON文件失败,请求排查代码问题
解决PowerShell修改JSON文件内容未生效的问题
你的代码核心问题是没有实际修改JSON对象的内部属性,只是在管道里做了零散的字符串替换,而且语法上也存在一些错误,导致最终输出的还是原JSON内容。我来一步步帮你修正:
原代码的问题拆解
- 管道语法错误:
ConvertFrom-Json $JsonData这部分写法无效,正确的逻辑应该是把读取到的JSON字符串直接转换成PowerShell对象并赋值给$JsonData。 - 未更新原JSON对象:你在管道里用
%做的字符串替换,只是输出了替换后的零散字符串,并没有把修改后的值写回$JsonData的对应属性里,最后又输出了原$JsonData,导致新文件里既有乱码的替换结果,又有原JSON内容。 - 无效替换操作:代码里的
-replace ("qa/js/act.2.js", "qa/js/act.2.js")完全没有实际作用,等于替换成自己,应该是替换act.js为act.2.js。
修正后的完整代码
# 读取JSON文件并转换为可操作的PowerShell对象 $JsonData = Get-Content $JsonFilePath -Raw | ConvertFrom-Json # 精准定位到name为"qact"的模块 $targetModule = $JsonData.modules | Where-Object { $_.name -eq "qact" } # 修改指定的文件路径 # 替换数组第一个元素:act.css → act.2.css $targetModule.load.local[0] = $targetModule.load.local[0] -replace "act.css", "act.2.css" # 替换数组最后一个元素:act.js → act.2.js(用[-1]不用关心数组长度) $targetModule.load.local[-1] = $targetModule.load.local[-1] -replace "act.js", "act.2.js" # 将修改后的对象转回JSON格式,保存到目标路径 $JsonData | ConvertTo-Json -Depth 4 | Set-Content $updatedJsonFilePath
代码逻辑说明
- 先把JSON字符串转换成PowerShell对象,这样可以直接操作对象的属性,比单纯字符串替换更可靠。
- 通过
Where-Object定位到目标模块后,直接修改它的load.local数组元素,确保修改的是原对象的内容。 - 最后用
ConvertTo-Json把修改后的对象转回JSON字符串,用Set-Content写入新文件,就能得到你预期的结果了。
内容的提问来源于stack exchange,提问作者rajpalla
相关产品推荐
相关产品推荐

