如何在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
相关产品推荐
相关产品推荐

