我遇到了将数组传递到Azure部署模板的问题。如果有一个对象,PowerShell会将其“转换”为字符串。在下面的示例中,$a
从一个函数返回,该函数根据标签的值获取VM作为对象。我通过将$a
其New-AzureRmResourceGroupDeployment
包装到cmdlet@()
。像这样:
$TemplateParameterObject=@{
VMObject=@($a)
}
New-AzureRmResourceGroupDeployment -ResourceGroupName $RG -Name "TestVmByRole" -Mode Incremental -DeploymentDebugLogLevel All -TemplateFile $templatePath -TemplateParameterObject $TemplateParameterObject -verbose
VMObject
是模板的参数之一。
可能不是最技术/最强大的方法,但是对于Azure来说就足够了。
更新资料
上面的工作很好。我已经尝试了以上所有内容,但我设法通过$vmObject
数组作为与部署模板兼容的唯一方法是,其中一个元素如下(我希望MS再次播放(这是一份报告,已修复错误在2015年)):
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
foreach($vmObject in $vmObjects)
{
#$vmTemplateObject = $vmObject
$asJson = (ConvertTo-Json -InputObject $vmObject -Depth 10 -Verbose) #-replace '\s',''
$DeserializedJson = (New-Object -TypeName System.Web.Script.Serialization.JavaScriptSerializer -Property @{MaxJsonLength=67108864}).DeserializeObject($asJson)
}
$vmObjects
是Get-AzureRmVM的输出。
我传递$DeserializedJson
给部署模板的参数(数组类型)。
供参考,可爱的错误New-AzureRmResourceGroupDeployment
抛出是
"The template output '{output_name}' is not valid: The language expression property 'Microsoft.WindowsAzure.ResourceStack.Frontdoor.Expression.Expressions.JTokenExpression'
can't be evaluated.."