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

Azure资源标签值替换实现及PowerShell脚本交互优化求助

Azure 资源/资源组标签批量替换脚本优化方案

需求说明

  • 原脚本仅支持替换标签键,需新增标签值替换功能
  • 将硬编码参数改为交互式输入,支持自定义旧键/旧值、新键/新值
  • 保留原有的备份CSV报告功能,记录修改前的标签状态

优化后的脚本

# 交互式输入参数
$oldKey = Read-Host "请输入要替换的旧标签键"
$oldValue = Read-Host "请输入要替换的旧标签值(留空则匹配该键下所有值)"
$newKey = Read-Host "请输入新标签键(留空则沿用旧键)"
$newValue = Read-Host "请输入新标签值(留空则沿用旧值)"

# 参数补全逻辑:处理用户留空的情况
if ([string]::IsNullOrWhiteSpace($newKey)) { $newKey = $oldKey }
if ([string]::IsNullOrWhiteSpace($newValue)) { $newValue = $oldValue }

# 确保备份目录存在
$backupPath = "C:\temp"
if (-not (Test-Path $backupPath)) { New-Item -Path $backupPath -ItemType Directory | Out-Null }
$timestamp = Get-Date -Format "yyyyMMddHHmmss"

# -------------------------- 处理资源组标签 --------------------------
Write-Host "`n开始扫描资源组..."
$rgsToProcess = Get-AzResourceGroup | Where-Object {
    # 匹配条件:标签键等于oldKey,且(oldValue为空 或 标签值等于oldValue)
    $_.Tags.ContainsKey($oldKey) -and ([string]::IsNullOrWhiteSpace($oldValue) -or $_.Tags[$oldKey] -eq $oldValue)
}

if ($rgsToProcess.Count -gt 0) {
    # 备份原始标签数据
    $rgBackupFile = "$backupPath\AzRGs-Tag-Backup-$oldKey-$timestamp.csv"
    $rgsToProcess | Select-Object ResourceGroupName, ResourceId, Tags | Export-Csv -Path $rgBackupFile -NoTypeInformation -Encoding UTF8
    Write-Host "已备份 $($rgsToProcess.Count) 个资源组的标签到: $rgBackupFile"

    # 遍历处理每个资源组
    $rgsToProcess | ForEach-Object {
        $rg = $_
        $resourceID = $rg.ResourceId
        $currentTags = $rg.Tags.Clone()

        # 删除旧标签(键+值匹配的情况)
        if ($currentTags.ContainsKey($oldKey) -and ([string]::IsNullOrWhiteSpace($oldValue) -or $currentTags[$oldKey] -eq $oldValue)) {
            $currentTags.Remove($oldKey)
        }

        # 添加新标签(如果新键已存在则覆盖值)
        $currentTags[$newKey] = $newValue

        # 更新标签
        Update-AzTag -ResourceId $resourceID -Tag $currentTags -Operation Replace | Out-Null
        Write-Host "已更新资源组 [$($rg.ResourceGroupName)] 的标签:[$oldKey=$oldValue] → [$newKey=$newValue]"
    }
} else {
    Write-Host "未找到符合条件的资源组"
}

# -------------------------- 处理资源标签 --------------------------
Write-Host "`n开始扫描资源..."
$resourcesToProcess = Get-AzResource | Where-Object {
    # 匹配条件:标签键等于oldKey,且(oldValue为空 或 标签值等于oldValue)
    $_.Tags -and $_.Tags.ContainsKey($oldKey) -and ([string]::IsNullOrWhiteSpace($oldValue) -or $_.Tags[$oldKey] -eq $oldValue)
}

if ($resourcesToProcess.Count -gt 0) {
    # 备份原始标签数据
    $resourceBackupFile = "$backupPath\AzResources-Tag-Backup-$oldKey-$timestamp.csv"
    $resourcesToProcess | Select-Object Name, ResourceType, ResourceId, Tags | Export-Csv -Path $resourceBackupFile -NoTypeInformation -Encoding UTF8
    Write-Host "已备份 $($resourcesToProcess.Count) 个资源的标签到: $resourceBackupFile"

    # 遍历处理每个资源
    $resourcesToProcess | ForEach-Object {
        $resource = $_
        $resourceID = $resource.ResourceId
        $currentTags = $resource.Tags.Clone()

        # 删除旧标签(键+值匹配的情况)
        if ($currentTags.ContainsKey($oldKey) -and ([string]::IsNullOrWhiteSpace($oldValue) -or $currentTags[$oldKey] -eq $oldValue)) {
            $currentTags.Remove($oldKey)
        }

        # 添加新标签(如果新键已存在则覆盖值)
        $currentTags[$newKey] = $newValue

        # 更新标签
        Update-AzTag -ResourceId $resourceID -Tag $currentTags -Operation Replace | Out-Null
        Write-Host "已更新资源 [$($resource.Name)](类型:$($resource.ResourceType))的标签:[$oldKey=$oldValue] → [$newKey=$newValue]"
    }
} else {
    Write-Host "未找到符合条件的资源"
}

Write-Host "`n标签处理完成!"

脚本核心功能说明

  • 灵活匹配规则:
    • 仅替换标签键:输入旧键、新键,旧值和新值留空
    • 仅替换标签值:输入旧键、旧值、新值,新键留空
    • 同时替换键和值:输入完整的旧键/旧值、新键/新值
  • 备份机制:自动生成带时间戳的CSV备份文件,避免覆盖历史记录,备份路径默认C:\temp
  • 安全处理:使用Replace操作直接更新整个标签集合,确保旧标签被精准移除,新标签正确添加
  • 状态反馈:实时输出处理进度,显示每个资源/资源组的修改详情

内容的提问来源于stack exchange,提问作者Wanderer8827

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:15:33