You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:16:27