我的变量在 powershell 中如下:
$lcr=@{"tierToCool"=@{"daysAfterModificationGreaterThan"=1};"tierToArchive"=@{"daysAfterModificationGreaterThan"=2}}
然后,当我使用 az cli 命令运行模板时,将变量作为对象传递到我的 Arm 模板中:
az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters lcr=$lcr
我收到以下错误:
Failed to parse JSON: System.Collections.Hashtable
Error Detail: Expecting value: line 1 column 1 (char 0)
我将参数传递到模板的方式或格式化它的方式有问题吗?非常感谢任何帮助。
最佳答案
以有用的评论为基础:
az
(Azure CLI)需要 JSON 作为--parameters
参数,即 JSON 字符串,而不是哈希表。- 将哈希表作为参数传递给外部程序通常是没有意义的,因为这样做会发送其字符串表示形式,这毫无帮助 - >类型名称,
'System.Collections.Hashtable'
- 将哈希表作为参数传递给外部程序通常是没有意义的,因为这样做会发送其字符串表示形式,这毫无帮助 - >类型名称,
虽然
--parameters (@{ lcr = $lcr } | ConvertTo-Json -compress)
应该足以发送哈希表的 JSON 表示形式,可悲的现实是,从 PowerShell 7.1 开始,您还需要\
-转义嵌入的"
字符,因为长时间-向外部程序传递参数时存在错误。最可靠的方法是(如果字符串中没有转义
"
,-replace '"', '\“'
就足够了):--parameters ((@{ lcr = $lcr } | ConvertTo-Json -Compress) -replace '([\\]*)"', '$1$1\"')
如果您有 JSON 字符串文字或存储在变量中的 JSON 字符串,请使用以下命令将其传递给外部程序(如果该字符串存储在变量
$var
中,请将其替换为'{ "foo": "bar"}'
与$var
):someProgram ... ('{ "foo": "bar" }' -replace '([\\]*)"', '$1$1\"')
请参阅 this answer 了解更多信息。
因此:
az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters ((@{ lcr = $lcr } | ConvertTo-Json -Compress) -replace '([\\]*)"', '$1$1\"')
一般 ConvertTo-Json
陷阱:您可能需要使用 -Depth
参数进行完整的 JSON 序列化,具体取决于对象图的嵌套深度(不需要)与您的示例输入) - 请参阅 this post 。
关于json - 如何将对象参数作为哈希表传递到 json arm 模板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68821054/