Azure自动化Runbook中PowerShell解析JSON参数报错:InputObject为空
问题分析与解决方案
错误原因:Runbook中定义的$json参数未接收到任何值,导致ConvertFrom-Json的输入对象为null,触发报错无法将参数绑定到参数‘inputobject’,因为它为null。核心问题是API请求的参数传递方式与Runbook的参数定义不匹配。
方案一:直接传递单个参数(推荐,符合Azure自动化规范)
Azure自动化Jobs API会自动将请求体parameters中的键值对映射为Runbook的对应参数,无需手动解析JSON。
1. 修改Runbook代码
直接声明所需的参数,去掉JSON解析步骤:
# Runbook Powershell Param( [parameter(Mandatory=$true)] [string]$VmName, [parameter(Mandatory=$true)] [string]$ResourceGroup ) # 禁用上下文自动保存 Disable-AzContextAutosave -Scope Process # 通过托管身份连接Azure $AzureContext = (Connect-AzAccount -Identity).context # 设置并保存上下文 $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext # 直接使用参数启动VM Start-AzVM -Name $VmName -ResourceGroupName $ResourceGroup -DefaultProfile $AzureContext
2. 保持API调用代码不变
你原有的请求体parameters字段已经包含VmName和ResourceGroup,与修改后的Runbook参数完全匹配,无需调整。
方案二:传递完整JSON字符串(适用于必须用单个参数的场景)
如果需要将所有参数打包成一个JSON对象传递,需将JSON转为字符串格式传入,并修改Runbook参数类型。
1. 修改API请求体
将parameters中的json参数值设置为转义后的JSON字符串:
$json = @" { "properties":{ "runbook":{ "name":"$runbook" } }, "parameters":{ "json" : "{\"VmName\":\"TestVM\",\"ResourceGroup\":\"$rg\"}" } } "@
注意:内部双引号需用反斜杠\转义,确保传递的是字符串类型的参数值。
2. 修改Runbook代码
将$json参数类型改为[string],再解析为JSON对象:
# Runbook Powershell Param( [parameter(Mandatory=$true)] [string]$json ) # 禁用上下文自动保存 Disable-AzContextAutosave -Scope Process # 通过托管身份连接Azure $AzureContext = (Connect-AzAccount -Identity).context # 设置并保存上下文 $AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext # 将JSON字符串转为对象 $jsonObj = $json | ConvertFrom-Json # 使用解析后的参数启动VM Start-AzVM -Name $jsonObj.VmName -ResourceGroupName $jsonObj.ResourceGroup -DefaultProfile $AzureContext
内容的提问来源于stack exchange,提问作者ITHelpGuy
相关产品推荐
相关产品推荐

