我可以在 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)"
我正在使用 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)"