执行Azure CLI恢复防火墙诊断设置时遭遇JSON解析失败
Azure CLI恢复防火墙诊断设置JSON解析错误问题
问题现象
运行Azure CLI命令恢复防火墙诊断设置时,触发Failed to parse string as JSON错误。
操作步骤与结果
通过PowerShell命令生成Metrics的JSON配置:
$metrics = ($fwDiagnostics.metrics) | ConvertTo-Json -Compress生成的JSON格式正常:
{"category":"AllMetrics","enabled":true,"retentionPolicy":{"days":90,"enabled":false},"timeGrain":null}执行Azure CLI诊断设置创建命令:
az monitor diagnostic-settings create --name $fwDiagnostics.name --metrics $metrics --workspace $fwDiagnostics.workspaceId --resource $resource.id出现错误提示,可见传入的JSON丢失了双引号:
Failed to parse string as JSON: {category:AllMetrics,enabled:true,retentionPolicy:{days:90,enabled:false},timeGrain:null} Error detail: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
问题原因
PowerShell在将$metrics变量传递给Azure CLI时,会自动解析字符串中的双引号,导致最终传入CLI的JSON丢失了必要的双引号,不符合JSON格式规范。
解决方法
方法一:通过文件传递JSON参数(推荐)
将生成的JSON写入临时文件,再通过Azure CLI的@file语法读取参数:
# 将JSON写入临时文件 $metrics | Out-File -Path .\temp_metrics.json -Encoding UTF8 # 执行CLI命令,从文件读取metrics参数 az monitor diagnostic-settings create --name $fwDiagnostics.name --metrics @temp_metrics.json --workspace $fwDiagnostics.workspaceId --resource $resource.id # 可选:删除临时文件 Remove-Item .\temp_metrics.json
方法二:转义双引号传递变量
在PowerShell中,将$metrics变量用额外的双引号包裹并转义,避免PowerShell解析内部双引号:
az monitor diagnostic-settings create --name $fwDiagnostics.name --metrics "`"$metrics`"" --workspace $fwDiagnostics.workspaceId --resource $resource.id
方法三:使用--%阻止PowerShell参数解析
--%是PowerShell的停止解析符号,后面的参数直接传递给Azure CLI,但注意此方法下PowerShell变量不会自动展开,需提前替换变量值:
# 提前获取变量值 $settingName = $fwDiagnostics.name $workspaceId = $fwDiagnostics.workspaceId $resourceId = $resource.id # 执行CLI命令 az monitor diagnostic-settings create --% --name $settingName --metrics $metrics --workspace $workspaceId --resource $resourceId
内容的提问来源于stack exchange,提问作者Raymondo
相关产品推荐
相关产品推荐

