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

Can I Iterate from JSON array in PowerShell?

我正在使用 Azure Pipelines 进行一些自动化操作,在一项工作中,我希望从 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 在任何类型的对象上可用的 intrinsic member,它是一个丰富的反射源;它的 .Properties 属性 returns 描述手边对象属性的对象集合,每个对象都有一个 .Name.Value 属性 .

  • 与您的 Python 代码一样,az 命令行只是 打印为字符串 ,未被调用。

    • 要执行实际调用,删除 @""@ 行(整个构造是一个 PowerShell here-string)。
  • "$($prop.Name)=$($prop.Value)" 会产生类似 "key1=value1" 的结果,PowerShell 会传递 而无需引用 az;只有当值部分包含 空格 时,PowerShell 才会双引号 - 整个 - 参数。

    • 如果az需要在其命令行上部分引用,例如key1="value 1",最简单的解决方案是通过[调用=25=]:

      cmd /c "az webapp config appsettings set -g resourceGroup -n appName --settings $($prop.Name)=`"$($prop.Value)`""
      
    • 如果您想避免这些复杂的问题,请考虑安装 Native module (Install-Module Native),其 ie 功能会自动为您执行部分引用(如果值部分包含空格),以及其他功能,以便您可以单独关注 PowerShell 的语法:

      ie az webapp config appsettings set -g resourceGroup -n appName --settings "$($prop.Name)=$($prop.Value)"