我查看了有关更新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子节点并保持格式化应该如此。任何帮助将不胜感激。
答案 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"
}