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
相关产品推荐
相关产品推荐

