Могу ли я выполнить итерацию из массива JSON в PowerShell?

#powershell #azure-devops #azure-cli

Вопрос:

Я использую конвейеры Azure для некоторой автоматизации, и в одном задании я хочу перейти от JSON к настройке параметров веб — приложения. Я использую powershell, но я изо всех сил пытаюсь сделать что-то подобное, сделанное на Python:

 import json

varJson = json.loads('''{
        "key1": "value1", 
        "key2": "value2", 
        "key3": "value3",
        "key4": "value4"
    }''')

for i in varJson:
    print(f'az webapp config appsettings set -g resourceGroup -n appName --settings {i}="{varJson[i]}"')
 

Результат, который я хочу, — это что-то вроде:

 az webapp config appsettings set -g resourceGroup -n appName --settings key1="value1"
...
 

Я пытался использовать объекты, но это сбивает меня с толку:

 $Json = @'
{
    "key1": "value1", 
    "key2": "value2", 
    "key3": "value3",
    "key4": "value4"
}
'@ | ConvertFrom-Json
ForEach-Object -InputObject $Json {
    Write-Host $_.PSObject.Properties.Name 
}
Write-Host $Json
 

Могу ли я сделать в PowerShell что-то похожее на то, что я сделал в python? Или есть более простой способ?

Ответ №1:

Попробуйте выполнить следующие действия:

 $fromJson = @'
{
    "key1": "value1", 
    "key2": "value2", 
    "key3": "value3",
    "key4": "value4"
}
'@ | ConvertFrom-Json

foreach ($prop in $fromJson.psobject.Properties) {
  @"
    az webapp config appsettings set -g resourceGroup -n appName --settings "$($prop.Name)=$($prop.Value)"
"@
}
 

Примечание:

  • .psobject является встроенным элементом, который PowerShell делает доступным для объектов любого типа, и он является богатым источником отражения; его .Properties свойство возвращает коллекцию объектов, описывающих свойства рассматриваемого объекта, каждый из которых имеет .Name .Value свойство и.
  • Как и в вашем коде Python, az командная строка просто выводится в виде строки, а не вызывается.
    • Чтобы выполнить фактические вызовы, удалите строки @" и "@ (конструкция в целом является здесь строкой PowerShell).
  • "$($prop.Name)=$($prop.Value)" приводит к чему-то вроде "key1=value1" того , что PowerShell передаст без кавычек az ; только если часть значения содержит пробелы, PowerShell заключит весь аргумент в двойные кавычки.
    • Если az требуется частичное цитирование в командной строке, например key1="value 1" , самое простое решение-позвонить через cmd.exe /c :
       cmd /c "az webapp config appsettings set -g resourceGroup -n appName --settings $($prop.Name)=`"$($prop.Value)`""
       
    • Если вы хотите быть защищенными от таких сложностей, рассмотрите возможность установки Native модуля ( Install-Module Native ), ie функция которого автоматически выполняет частичное цитирование для вас (если часть значения содержит пробелы), среди других функций, чтобы вы могли сосредоточиться только на синтаксисе PowerShell:
       ie az webapp config appsettings set -g resourceGroup -n appName --settings "$($prop.Name)=$($prop.Value)"