【问题标题】:Can I Iterate from JSON array in PowerShell?我可以从 PowerShell 中的 JSON 数组进行迭代吗?
【发布时间】:2021-11-10 22:41:11
【问题描述】:

我正在使用 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 中所做的事情吗?还是有更简单的方法?

【问题讨论】:

    标签: powershell azure-devops azure-cli


    【解决方案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 是一个intrinsic member,PowerShell 可以在任何类型的对象上使用它,它是一个丰富的反射源;它的.Properties 属性返回描述手头对象属性的对象集合,每个对象都有一个.Name.Value 属性。

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

      • 要执行实际调用,请删除 @""@ 行(整个结构是 PowerShell here-string)。
    • "$($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 module (Install-Module Native),其ie 函数会自动为您执行部分引用(如果值部分包含空格),以及其他功能,这样您就可以只专注于 PowerShell 的语法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多