PowerShell中If语句未按预期工作问题求助
解决PowerShell脚本的标签设置错误问题
我来帮你修复这个脚本的问题,咱们先拆解一下你遇到的两个核心错误,再给出修正后的完整代码:
错误原因分析
1. 通配符未加引号引发语法错误
在if ($vm.Name -like *dc*)这类判断里,*dc*是通配符字符串,必须用引号(单引号或双引号)包裹起来。PowerShell会把未加引号的*当成运算符,所以才会提示You must provide value Expression following the * Operator。正确的写法应该是$vm.Name -like "*dc*"或者$vm.Name -like '*dc*'。
2. foreach循环错误使用$_自动变量
你用的是普通的foreach ($vm in $vms)循环,这种循环的当前对象是定义的$vm变量,而$_是用于管道(| ForEach-Object)或者.ForEach()方法的自动变量。所以你在循环里写的$_.Tags、$_.Id都是无效的,应该替换成$vm.Tags和$vm.Id——这个错误也会导致脚本末尾的}出现语法报错(因为前面的语法错误引发了解析混乱)。
修正后的完整脚本
我还帮你优化了判断逻辑,把DC和SQL的判断合并成一个条件,让代码更简洁:
[CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$RG ) $rgs = Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like "*$rg*"} foreach ($rg in $rgs) { $vms = Get-AzureRmVm -ResourceGroupName $rg.ResourceGroupName foreach ($vm in $vms) { # 合并DC和SQL的判断条件 if ($vm.Name -like "*dc*" -or $vm.Name -like "*SQL*") { $tags = $vm.Tags $tags['ShutdownSchedule_AllowStop'] = $false # 这里不用转成字符串,直接用布尔值即可 Set-AzureRmResource -ResourceId $vm.Id -Tag $tags -Force -Verbose } else { $tags = $vm.Tags $tags['ShutdownSchedule_AllowStop'] = $true Set-AzureRmResource -ResourceId $vm.Id -Tag $tags -Force -Verbose } } }
额外优化点
- 把
"$False"/"$True"改成直接用布尔值$false/$true,因为Azure资源标签支持布尔类型,不需要转成字符串,这样更规范。 - 合并了两个
if判断,用-or运算符简化逻辑,减少重复代码。
内容的提问来源于stack exchange,提问作者Norrin Rad
相关产品推荐
相关产品推荐

