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

Azure自动化PowerShell Runbook获取VM详情并导出Blob问题求助

Azure自动化Runbook脚本修复:VM详情导出至Blob存储

原脚本核心问题

  • Az模块与AzureRM模块混用,导致Blob上传失败
  • VM与网卡的匹配逻辑效率低下且易出错
  • 公网IP匹配逻辑错误(未遍历网卡的IP配置集合)
  • 应用安全组ID未做格式化处理,导出后显示异常
  • 临时文件路径未指定自动化沙盒的合法路径
  • 缺乏错误捕获机制,无法快速定位问题

修复后的完整脚本

# 确保使用Az模块,避免与AzureRM冲突
Connect-AzAccount -Identity

$subscriptionId = "mySubID"
$reportName = "myReport.csv"
$storageAccountName = "storagename"
$storageAccountKey = "storagekey"
$containerName = "conttainername"
# 使用自动化沙盒的临时目录存储CSV,避免路径权限问题
$tempCsvPath = Join-Path -Path $env:TEMP -ChildPath "AutomationFile123.csv"

# 切换目标订阅
Select-AzSubscription -SubscriptionId $subscriptionId

# 预加载资源并创建哈希表,优化后续匹配效率
$vms = Get-AzVM
$vmHash = @{}
foreach ($vm in $vms) {
    $vmHash[$vm.Id] = $vm
}

$publicIps = Get-AzPublicIpAddress
$publicIpHash = @{}
foreach ($ip in $publicIps) {
    if ($ip.IpConfiguration.Id) {
        $publicIpHash[$ip.IpConfiguration.Id] = $ip.IpAddress
    }
}

$nics = Get-AzNetworkInterface | Where-Object { $_.VirtualMachine -ne $null }
$report = @()

foreach ($nic in $nics) {
    # 通过哈希表快速匹配关联VM
    $vm = $vmHash[$nic.VirtualMachine.Id]
    if (-not $vm) {
        Write-Warning "未找到与网卡 $($nic.Name) 关联的VM"
        continue
    }

    # 用PSCustomObject创建结构化数据,比Select更高效
    $info = [PSCustomObject]@{
        VmName                  = $vm.Name
        ResourceGroupName       = $vm.ResourceGroupName
        Region                  = $vm.Location
        VmSize                  = $vm.HardwareProfile.VmSize
        VirtualNetwork          = $nic.IpConfigurations.Subnet.Id.Split("/")[-3]
        Subnet                  = $nic.IpConfigurations.Subnet.Id.Split("/")[-1]
        PrivateIpAddress        = $nic.IpConfigurations.PrivateIpAddress -join ", "
        OsType                  = $vm.StorageProfile.OsDisk.OsType
        PublicIPAddress         = ""
        NicName                 = $nic.Name
        ApplicationSecurityGroup = $nic.IpConfigurations.ApplicationSecurityGroups.Id -join ", "
    }

    # 遍历网卡所有IP配置,匹配对应公网IP
    foreach ($ipConfig in $nic.IpConfigurations) {
        if ($publicIpHash.ContainsKey($ipConfig.Id)) {
            $info.PublicIPAddress += $publicIpHash[$ipConfig.Id] + ", "
        }
    }
    # 清理末尾多余的逗号
    $info.PublicIPAddress = $info.PublicIPAddress.TrimEnd(", ")

    $report += $info
}

# 输出预览并导出CSV(指定UTF8编码避免乱码)
$report | Format-Table VmName, ResourceGroupName, Region, VmSize, VirtualNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, NicName, ApplicationSecurityGroup
$report | Export-Csv -Path $tempCsvPath -NoTypeInformation -Encoding UTF8

# 使用Az模块上传Blob,替换原AzureRM命令
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
Set-AzStorageBlobContent -Context $storageContext -Container $containerName -File $tempCsvPath -Blob "AutomationFile123.csv" -Force

# 清理临时文件
Remove-Item -Path $tempCsvPath -Force

关键修复说明

  1. 统一Az模块:替换AzureRM模块的Blob操作命令,避免模块版本冲突导致上传失败
  2. 哈希表优化匹配:将VM和公网IP的匹配逻辑从遍历改为哈希表查找,大幅提升效率并避免匹配错误
  3. 修正公网IP匹配:遍历网卡的每个IP配置,确保正确关联对应的公网IP
  4. 格式化数组字段:将多IP地址、多应用安全组ID用逗号拼接为字符串,避免CSV导出后显示异常
  5. 合法临时路径:使用自动化沙盒的$env:TEMP目录存储CSV,解决路径权限问题
  6. 新增错误提示:添加未找到关联VM的警告日志,便于排查资源关联问题
  7. 优化对象创建:使用PSCustomObject替代"" | Select,提升数据结构的稳定性和效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:43:35