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

如何在Azure PowerShell脚本中设置带通配符的$MyVar变量?

解决Azure PowerShell脚本中带通配符的资源组匹配问题

我来帮你搞定这个带通配符匹配资源组的问题!你的脚本里主要有两个小细节需要调整,同时我也会教你怎么把$MyVar设为灵活的脚本参数,不用每次改脚本内容就能适配不同的匹配规则。

1. 修复变量解析的核心问题

你之前用单引号包裹'$MyVar',PowerShell会把它当作纯字面量字符串,根本不会解析成变量的实际值。要让变量生效,得换成双引号(或者直接引用变量,如果变量里没有空格/特殊字符),而且$MyVar本身要包含通配符(*匹配任意长度字符,?匹配单个字符)。

举个例子:

# 匹配所有以"prod-"开头的资源组
$MyVar = "prod-*"
# 或者匹配名称中包含"test"的资源组
$MyVar = "*test*"

然后在Where-Object里这样写就生效了:

Where-Object {$_.ResourceGroupName -like "$MyVar"}

2. 将$MyVar设为脚本参数(非工作流场景)

如果想让脚本更灵活,不用每次修改脚本里的变量值,可以用param()块把匹配规则定义为脚本参数,运行脚本时直接传入值即可。

修改后的完整脚本

param(
    # 定义带通配符的资源组名称参数,强制要求输入(可选:可以加默认值)
    [Parameter(Mandatory=$true)]
    [string]$ResourceGroupPattern
)

Select-AzureRmSubscription -SubscriptionName "MySubscription"
Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like $ResourceGroupPattern} | ForEach-Object {
    $VMs = Get-AzureRmVM -ResourceGroupName $_.ResourceGroupName
    ForEach ($vm in $vms) {
        $tags2 = $VM.tags
        # 合并新标签:如果原有标签有同名键,新值会覆盖旧值
        $tags2 += @{ShutdownSchedule_AllowStart="True"; ShutdownSchedule_AllowStop="True" }
        Set-AzureRmResource -ResourceName $vm.Name -ResourceGroupName $vm.ResourceGroupName -ResourceType "Microsoft.Compute/virtualMachines" -Tag $tags2 -Force -Verbose
    }
}

运行脚本的方式

打开PowerShell,切换到脚本所在目录,直接传入匹配规则即可:

# 匹配所有以"dev-"开头的资源组
.\你的脚本文件名.ps1 -ResourceGroupPattern "dev-*"

# 匹配名称包含"staging"的资源组
.\你的脚本文件名.ps1 -ResourceGroupPattern "*staging*"

额外提醒

  • 如果你的环境用的是较新的Azure模块,建议把AzureRm替换成Az(比如Select-AzSubscription、Get-AzResourceGroup),AzureRM模块已经停止维护了。
  • 如果VM原本就有ShutdownSchedule_AllowStart或ShutdownSchedule_AllowStop标签,新值会覆盖旧值,这是PowerShell哈希表合并的默认行为。
  • 通配符*可以放在字符串任意位置,比如"prod-*east"会匹配所有以prod-开头、以east结尾的资源组名称。

内容的提问来源于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:20:51