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

PowerShell导出Azure VM标签CSV显示System.Object而非实际值求助

问题解决:Azure VM标签导出CSV显示System.Object而非实际键值对

问题原因

你的脚本存在两个核心问题导致标签列显示System.Object:

  • 循环中调用Get-AzVM | Select-Object ...返回的是含Tags属性的PSObject对象,而非直接的标签字符串,Export-CSV无法解析对象类型,因此显示类型名称。
  • 标签获取逻辑错误:没有针对当前循环的VM,而是获取了所有VM的标签集合,完全偏离需求。

修正后的脚本

# 登录Azure
Connect-AzAccount

# 获取订阅内所有虚拟机
$azureVMDetails = Get-AzVM

# 获取关联了VM的网卡
$azureNICDetails = Get-AzNetworkInterface | Where-Object { $_.VirtualMachine -ne $null }

$virtual_machine_object = @()

foreach($azureNICDetail in $azureNICDetails){ 
    # 根据NIC关联的VM ID匹配对应的VM对象
    $azureVMDetail = $azureVMDetails | Where-Object Id -eq $azureNICDetail.VirtualMachine.id 
    
    # 将当前VM的标签转换为可读字符串(键=值,逗号分隔)
    if ($azureVMDetail.Tags) {
        $vm_tags = $azureVMDetail.Tags.GetEnumerator() | ForEach-Object { "{0} = {1}" -f $_.Key, $_.Value } -join ", "
    } else {
        $vm_tags = "无标签"
    }

    # 构建输出对象
    $virtual_machine_object_temp = [PSCustomObject]@{
        "name"     = $azureVMDetail.Name
        "comments" = $vm_tags
    }
    $virtual_machine_object += $virtual_machine_object_temp
}  

# 导出到CSV文件
$virtual_machine_object | Export-Csv "C:\Users\JOHN\Desktop\Inventory_$(Get-Date -f dd.MM.yyyy).csv" -NoTypeInformation -Force

关键修正说明

  • 复用已获取的$azureVMDetail对象的Tags属性,避免重复调用Get-AzVM,既提升效率又确保针对当前VM。
  • 将标签集合转换为纯字符串:通过GetEnumerator()遍历键值对,拼接成键=值格式后用逗号分隔,保证Export-CSV能识别为文本内容。
  • 增加无标签场景的默认值处理,避免导出空值。
  • 用[PSCustomObject]替代New-Object+Add-Member,语法更简洁高效。

额外优化建议

可以直接从VM对象关联网卡信息,无需先遍历NIC再反向匹配VM,进一步提升脚本效率:

# 替代原循环的高效写法
foreach ($vm in $azureVMDetails) {
    foreach ($nicId in $vm.NetworkProfile.NetworkInterfaces.Id) {
        $nic = Get-AzNetworkInterface -ResourceId $nicId
        # 后续标签处理等逻辑可直接复用前面的代码
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:30:58