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