Замените значение в файле 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"
                                 }
                 }
}

Я пытаюсь сделать следующее:

  1. Просмотрите файл Config.json и сохраните значения для сегментов "имя" и "значение" в переменных. Значение сегмента "имя" - это путь в файле ABlob_AAD_Snapshot.json.
  2. Следуйте по пути в файле 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=;, ...}",

Другие вопросы по тегам