Замените значение в файле JSON с помощью Powershell
Как заменить значение в файле JSON другим значением, взятым из файла конфигурации (JSON)? Это код для файлов JSON:
Config.json
{
"ABlob_AAD_Snapshot": [
{
"name": "properties.availability.frequency",
"value": "$Frequency$"
}]
}
ABlob_AAD_Snapshot.json
{
"name": "AzureBlobStore",
"properties": {
"type": "AzureStorage",
"availability": {
"frequency": "Value from Config.json file"
}
}
}
Я пытаюсь сделать следующее:
- Просмотрите файл Config.json и сохраните значения для сегментов "имя" и "значение" в переменных. Значение сегмента "имя" - это путь в файле ABlob_AAD_Snapshot.json.
- Следуйте по пути в файле ABlob_AAD_Snapshot.json и замените сегмент "частота" значением сегмента "значение" (
$frequency$
)
После этого процесса ABlob_AAD_Snapshot.json должен выглядеть следующим образом:
{
"name": "AzureBlobStore",
"properties": {
"type": "AzureStorage",
"availability": {
"frequency": "$frequency$"
}
}
}
Проблема здесь в том, что мой исходный файл config.json имеет более одного массива (который представляет имена файлов), поэтому я буду анализировать более одного файла, и значение для сегмента "name" не всегда будет одинаковым, я имею в виду, в этом случае значение (или путь) properties.availability.frequency
но это может быть properties.activities.scheduler.interval
или же properties.activities.typeProperties.extendedProperties.WebAppClientID
,
Таким образом, как вы можете видеть, имя и количество "узлов" могут измениться.
Это мой скрипт PowerShell:
$ScriptPath = split-path -parent $MyInvocation.MyCommand.Definition
#path to config file
$ConfigFile = "$ScriptPath\ParameterConfigOriginal.json"
#Convert the json file to PSObject
$json = Get-Content $ConfigFile | Out-String | ConvertFrom-Json
#Get all the arrays (files) in Conifg.json
$files = $json | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name
#Go through all the arrays (files)
Foreach($file in $files)
{
if( $file -eq '$schema') {continue}
#store the path of the file to be modified
$FileName = $file + ".json"
$FilePath = "$ScriptPath\LinkedServices\" + $FileName"
#Go through all the elements of the arrray
Foreach($item in $json.$file)
{
#Store the path
$name = $item.name
#Store the value
$value = $item.value
#Convert the file to be modified to PSObject
$file = Get-Content $FilePath | Out-String | ConvertFrom-Json
#======STUCK IN HERE=============
# How can dynamically navigate through the file nodes like this?
$file.properties.availability.frequency
#and set the corresponding value
$file.properties.availability.frequency = $value
}
}
Я новичок в мире PowerShell и не знаю, есть ли командлет, который помогает мне делать то, что мне нужно.
Любое предложение будет оценено.
РЕДАКТИРОВАТЬ
Простой Путь
$snapshot.properties.availability.frequency
Путь с массивами
$snapshot.properties.activities[0].scheduler.frequency
это пример файла JSON с массивом файла назначения
и это результат файл назначения обновлен
Есть идеи о том, что может происходить?
1 ответ
Invoke-Expression
поможет вам.
#Go through all the arrays (files)
Foreach($file in $files)
{
$snapshot = (Get-Content ("./" + $file + ".json") | ConvertFrom-Json)
# get config corresponds to the $file
$config = Invoke-Expression ('$json.' + $file)
# set value according to the config
Invoke-Expression ('$snapshot.' + $config.name + "='" + $config.value + "'")
# $snapshot.properties.availability.frequency
# -> $Frequency$
}
редактировать
Вы должны использовать ConvertTo-Json -Depth 100
правильно записать результат в файл JSON (укажите соответствующую глубину в соответствии с вашими файлами JSON.). Без -Depth
вариант, вы получите результат как "@{type=Copy, typeProperties=;, ...}"
,