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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:11