Powershell使用新成员更新json输出

时间:2017-05-16 21:53:37

标签: json powershell

我查看了有关更新JSON文件的过去问题,但似乎无法找到我正在寻找的内容。

让我们从脚本本身开始。

foreach ($Ip in $Ips) { Code here that runs against IPs. foreach ($Cluster in $getCluster) { Get-Cluster -name $Cluster | select @{Name='attName';Expression {$IP}}, Name, att1, att2, att3, att4, att5, att6, att7, att8 | Convertto-Json | out-file $ConfigFile.Results.ClusterOutput } } 现在,这个脚本第一次第一次运行时会到达集群部分。它创建一个.txt文件,其中包含Json数据。该文件如下所示:

首次运行ForEach $ IP [ { "attName": "1.1.1.1", "Name": "testData", "att1": value, "att2": value, "att3": value, "att4": value, "att5": value, "att6": null, "att7": null, "att8": null }, { "attName": "2.2.2.2", "Name": "testData", "att1": value, "att2": value, "att3": value, "att4": value, "att5": value, "att6": null, "att7": null, "att8": null } ] 现在,当第一个foreach完成第二个foreach时,我需要它为下一个出现的IP地址添加这些属性。我希望它看起来如下。

ForEach $ IP的第二次运行 [ { "attName": "1.1.1.1", "Name": "testData", "att1": value, "att2": value, "att3": value, "att4": value, "att5": value, "att6": null, "att7": null, "att8": null }, { "attName": "2.2.2.2", "Name": "testData", "att1": value, "att2": value, "att3": value, "att4": value, "att5": value, "att6": null, "att7": null, "att8": null }, { This is the second runs data. "attName": "3.3.3.3", "Name": "testData", "att1": value, "att2": value, "att3": value, "att4": value, "att5": value, "att6": null, "att7": null, "att8": null } ] 我觉得我需要一个if语句来检查文件是否已创建 - 如果它不是第一次运行 - 如果它还没有写入,那么添加"属性到现有文件"。

这是我现在发现和看到的内容。到目前为止,我还没有成功完成这项工作。

编辑:我应该澄清一点,这是我的坏。以下信息是我一直在测试并试图开始工作的事情。多数民众赞成不是说它们起作用 - 它只是我发现的参考资料。

<# if (Test-Path $ConfigFile.Results.ClusterOutput){ (New-Object PSObject | Add-Member -PassThru NoteProperty Name $getClusterConfig.Name | Add-Member -PassThru NoteProperty Age 10 | Add-Member -PassThru NoteProperty Amount 10.1
) | Convertto-Json #pathToJson = "F:\Path\To\JSON\file.json" # $a = Get-Content $ConfigFile.Results.ClusterOutput | ConvertFrom-Json #$a.policies.'Framework.DataContext'.connectionString = "Server=ServerName;Database=DateBaseName;Integrated Security=sspi2;" #$a | ConvertTo-Json | set-content $pathToJson } else{ Get-Cluster -name $Cluster | select @{Name='attName';Expression {$IP}}, Name, att1, att2, att3, att4, att5, att6, att7, att8 | Convertto-Json | out-file $ConfigFile.Results.ClusterOutput }

我的问题是如何获取if than else语句来添加下一个json子节点并保持格式化应该如此。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,我认为你想要json文件追加这样的东西:

#if file does exist read in json and append to json
if(Test-path "test.json"){
    $jsondata = Get-Content test.json | ConvertFrom-Json 
    #add hashtable of info to array with +=
    $jsondata += @{"Test"="ech";"ech"="test"}
}
#else file does not exist, create from scratch
else{
    #an array for the initial array of json dicts/hashmaps
    $jsondata = @()
    #add first hashtable with data
    $jsondata += @{"Test"="ech";"ech"="test"}
}
#overwrite file
ConvertTo-Json $jsondata | Out-File test.json 

我也认为您可能想重新考虑使用管道,管道很好但是它使代码很难阅读并弄清楚发生了什么。

考虑这样的事情:

else{
    #an array for the initial array of json hashtable
    $jsondata = @()
    $cluster = Get-Cluster -name $Cluster
    $jsondata += @{Name=$cluster.attName; Otherattr=$cluster.data} #etc
    ConvertTo-Json $jsondata | Out-File "filehere"

}