如何使用PowerShell更新JSON文件

66

我有一个名为mytest.json的JSON文件,想要使用PowerShell脚本更新其中的值。

update.json

{
    "update": [
        {
            "Name": "test1",        
            "Version": "2.1"
        },
        {
            "Name": "test2",        
            "Version": "2.1"
        }   
    ]
}

我希望编写一个PowerShell脚本,在其中如果Name=="test1",我想要更新Version为"3"。如何使用参数实现?

2个回答

133

这是一种方法:

$a = Get-Content 'D:\temp\mytest.json' -raw | ConvertFrom-Json
$a.update | % {if($_.name -eq 'test1'){$_.version=3.0}}
$a | ConvertTo-Json -depth 32| set-content 'D:\temp\mytestBis.json'

根据 @FLGMwt 和 @mikemaccana 的说法,我改进了 ConvertTo-Json 命令,并加入了 -depth 32 参数,因为默认深度值为2,在处理深度大于2的对象时,你将会收到类信息而非对象信息。


57
请注意,ConvertTo-Json 命令默认的深度为 2。如果您的 JSON 数据嵌套很深,则会得到转换为字符串的结果,这可能不是您想要的。如果您有更多嵌套的 JSON 数据,请使用 Depth 参数:ConvertTo-Json -Depth 20 - FLGMwt
depth问题的参考资料:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-6 - mikemaccana
@mikemaccana 感谢您对 depth 进行调整,但 1000 太重要了。我还添加了一个小的解释。 - JPBlanc

15

我也曾面临同样的问题。我想要更改以下JSON文件中的记录。

{
"SQS_QUEUE_URL":  "https://que-url.com/server1",
"SQS_EVENTS_QUEUE_URL":  "https://events-server.com/server1/development_events",
"REGION":  "region1",
"BUCKET":  "test-bucket",
"AE_WORK_PATH":  "C:\\workpath\\path1",
"ENV":  "env"

}

终于,我设法找到了从Powershell生成JSON文件的最简单方法。

$json = Get-Content "c:\users\bharat.gadade\desktop\test.json" | ConvertFrom-Json 
$json.SQS_QUEUE_URL = "https://que-url.com/server2"
$json.SQS_EVENTS_QUEUE_URL = "https://events-server.com/Server2/development_events"
$json.REGION = "region1 "
$json.BUCKET = "test-bucket"
$json.AE_WORK_PATH = "C:\workpath\path1"
$json.ENV = "env"
$json | ConvertTo-Json | Out-File "c:\users\bharat.gadade\desktop\test.json"

4
另外,对于具有层次结构的JSON数据,您可以使用句点运算符引用标题下的标记。因此,如果您的JSON数据如下: {"Settings": {"AWS_REGION": "us-east-1" }}您可以使用$json.Settings.AWS_REGION来设置或读取该条目! - Kevinsyel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接