我可以从JSON数组在PowerShell迭代?



我正在使用Azure pipeline进行一些自动化,并且在一个作业中,我希望从JSON迭代到配置WebApp设置。我正在使用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中做的事情吗?或者有更简单的方法?

尝试如下:

$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 here-string)。
  • "$($prop.Name)=$($prop.Value)"的结果类似于"key1=value1", PowerShell将传递而不引用az;只有当value部分包含空格时,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)"
      

最新更新