PowerShell执行Start-Job时报argument is null错误,如何在脚本块内引用外部变量
报错根因
Start-Job的脚本块运行在独立的子进程上下文中,默认无法直接访问父会话中定义的变量,所有外部变量在脚本块内默认都是$null,因此会触发参数空校验失败的报错。
解决方法
方法1:使用$using:作用域修饰符(推荐,PowerShell 3.0及以上版本支持)
直接在脚本块内需要引用的外部变量前添加$using:前缀即可,修改后代码示例:
$RG = "xx" $Location1 = "xx" $VNET1="xx" $PublicIP1="xx" $VNGW1 = "xx" # 注意你原代码中的$gwipconf1未在外部定义,需先补充完成该变量的赋值 $gwipconf1 = 你的网关IP配置值 Start-Job { New-AzVirtualNetworkGateway -Name $using:VNGW1 -ResourceGroupName $using:RG -Location $using:Location1 -GatewayType Vpn -VpnType RouteBased -GatewaySku VpnGw1 -Asn 65511 -IpConfigurations $using:gwipconf1 -EnableBgp $True }
方法2:使用-ArgumentList传参+param接收(兼容所有PowerShell版本)
通过Start-Job的-ArgumentList参数把外部变量按顺序传入,脚本块内用param块按顺序接收参数即可,修改后代码示例:
$RG = "xx" $Location1 = "xx" $VNET1="xx" $PublicIP1="xx" $VNGW1 = "xx" # 同样需要先完成$gwipconf1的赋值 $gwipconf1 = 你的网关IP配置值 Start-Job { param($pRG, $pLocation1, $pVNGW1, $pgwipconf1) New-AzVirtualNetworkGateway -Name $pVNGW1 -ResourceGroupName $pRG -Location $pLocation1 -GatewayType Vpn -VpnType RouteBased -GatewaySku VpnGw1 -Asn 65511 -IpConfigurations $pgwipconf1 -EnableBgp $True } -ArgumentList $RG, $Location1, $VNGW1, $gwipconf1
注意事项
- 原代码中用到的
$gwipconf1变量没有在父作用域定义,无论使用哪种方法都需要先完成该变量的赋值,否则仍然会触发空参数报错。
内容的提问来源于stack exchange,提问作者Sajith
相关产品推荐
相关产品推荐

