在powershell中我的变量如下:
$lcr=@{"tierToCool"=@{"daysAfterModificationGreaterThan"=1};"tierToArchive"=@{"daysAfterModificationGreaterThan"=2}}
然后,当我使用az cli命令运行模板时,将变量作为对象传递到我的手臂模板:
az deployment group create --subscription <hidden> --resource-group <hidden> --template-file <hidden> --parameters lcr=$lcr
我得到以下错误:
解析JSON失败:System.Collections.Hashtable
Error Detail: expected 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"')
-
更多信息请看答案
因此: -
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的序列化,这取决于你的对象图嵌套的深度(你的样本输入不需要)——参见这篇文章。