Почему вы определяете значения замены в виде строки JSON?Это просто сделает вашу жизнь более несчастной.Если вы в любом случае определяете значения в своем скрипте, просто сразу определите их как хеш-таблицы:
$newUrls = @{
'Foo' = 'http://newfoo.example.com'
'Bar' = 'http://newbaz.example.com'
'Blee' = 'http://newblee.example.com'
}
$newKeys = @{
'Foo' = '67890'
}
Даже если вы хотите прочитать их из файла, вы можете сделать этот файл скриптом PowerShell, содержащим эти хеш-таблицы иточечный источник это.Или, по крайней мере, определите значения в виде списков key=value
строк в текстовых файлах, которые легко можно превратить в хеш-таблицы:
$newUrls = Get-Content 'new_urls.txt' | Out-String | ConvertFrom-StringData
$newKeys = Get-Content 'new_keys.txt' | Out-String | ConvertFrom-StringData
Затем выполните итерации по свойствам верхнего уровня ваших входных данных JSON и заменитевложенные свойства с новыми значениями:
$json = Get-Content $filePath | Out-String | ConvertFrom-Json
foreach ($name in $json.PSObject.Properties) {
$json.$name.BaseUrl = $newUrls[$name]
if ($newKeys.ContainsKey($name)) {
$json.$name.UrlKey = $newKeys[$name]
}
}
$json | ConvertTo-Json | Set-Content $filePath
Обратите внимание, что если ваши фактические данные JSON имеют более 2 уровней иерархии, вам нужно будет указать ConvertTo-Json
через параметр -Depth
, сколько уровней предполагаетсядля преобразования.
Примечание: требуется передача Get-Content
через Out-String
, поскольку ConvertFrom-Json
ожидает ввод JSON в виде одной строки, а использование Out-String
делает код работающим со всемиВерсии PowerShell.Если у вас PowerShell v3 или новее, вы можете немного упростить код, заменив Get-Content | Out-String
на Get-Content -Raw
.