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

Azure VM位置替换自定义短名导出CSV遇Hashtable错误求助

问题分析与解决

你的脚本存在三个核心问题:

  • 先将$locations赋值为虚拟机的位置列表,紧接着又用哈希表覆盖该变量,直接丢弃了虚拟机的实际位置数据
  • 直接把哈希表传给Export-Csv,PowerShell无法直接将哈希表结构导出为CSV,这就是你看到System.Collections.Hashtable错误的原因
  • 没有关联虚拟机的标识(比如名称),就算导出成功也无法对应短名到具体VM

修正后的脚本

function Get-VMLocations {
    # 定义位置映射哈希表
    $locationMap = @{
        "westeurope"         = "weu"
        "northeurope"        = "neu"
        "germanywestcentral" = "gwc"
    }

    # 获取所有VM信息,转换位置并生成结构化数据
    $vmLocationData = Get-AzVM | ForEach-Object {
        # 匹配哈希表转换位置,未匹配到则保留原名称
        $shortLocation = if ($locationMap.ContainsKey($_.Location)) {
            $locationMap[$_.Location]
        } else {
            $_.Location
        }

        # 创建包含关键信息的自定义对象
        [PSCustomObject]@{
            VMName        = $_.Name
            OriginalLocation = $_.Location
            ShortLocation = $shortLocation
        }
    }

    # 导出到CSV文件
    $vmLocationData | Export-Csv "C:\Azure Virtual Machines details_$(Get-Date -f dd.MM.yyyy).csv" -NoTypeInformation -Force
}

关键修改说明

  • 将位置映射哈希表重命名为$locationMap,避免覆盖虚拟机位置数据
  • 使用ForEach-Object遍历每台虚拟机,逐个完成位置映射转换
  • 用[PSCustomObject]创建结构化数据对象,让Export-Csv能正确识别字段并导出
  • 增加VM名称和原位置字段,让CSV内容更具实用性;若不需要原位置可直接删除对应属性
  • 处理了哈希表未覆盖的位置(保留原名称),避免出现空值

使用步骤

  1. 确保已安装Azure PowerShell模块并完成登录(执行Connect-AzAccount)
  2. 运行Get-VMLocations即可生成包含VM名称、原位置和短位置的CSV文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:35:24