Azure PowerShell脚本报错$_未设置:变量RG指定资源组遇问题
问题诊断与修复方案
你遇到的错误根源有两个核心问题,咱们一步步拆解:
1. 未捕获资源组查询结果,且循环变量误用
你执行了Get-AzureRmResourceGroup | Where-Object {...}但没有把结果赋值给变量,导致后续foreach循环的遍历对象$rgs根本不存在;另外,foreach循环内部不能用$_指代当前项——$_是管道命令(比如| ForEach-Object)里的专属当前对象变量,而foreach循环的当前项是你定义的循环变量(这里还和参数$RG重名了,很容易混淆)。
2. 变量名冲突(可选但关键)
你的参数$RG和循环变量$rg虽然PowerShell不区分大小写,但代码可读性极差,极易引发逻辑混乱,建议把循环变量改成$resourceGroup这类更清晰的名称。
修正后的完整代码
[CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$RG ) # 先把查询到的资源组结果赋值给变量$resourceGroups $resourceGroups = Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like "*$RG*"} # 循环遍历每个资源组,用$resourceGroup指代当前项 foreach ($resourceGroup in $resourceGroups) { # 用当前资源组的名称获取虚拟机,替换错误的$_为$resourceGroup $vms = Get-AzureRmVm -ResourceGroupName $resourceGroup.ResourceGroupName $vms.ForEach({ $tags = $_.Tags $tags['ShutdownSchedule_AllowStop'] = "whatever"; Set-AzureRmResource -ResourceId $_.Id -Tag $tags -Force }) }
额外优化建议
- 如果你需要精确匹配资源组名称,把
-like "*$RG*"改成-eq $RG会更高效; - 注意
Get-AzureRm系列模块是微软已停止维护的旧版Azure PowerShell模块,建议升级到Az模块(对应命令如Get-AzResourceGroup、Get-AzVM等),获得更好的兼容性和功能支持。
内容的提问来源于stack exchange,提问作者Norrin Rad
相关产品推荐
相关产品推荐

