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

Azure虚拟机磁盘与网络信息导出CSV脚本无磁盘数据问题排查

错误原因梳理
  • 错误1:多余的$vm重赋值逻辑完全错误。原代码中已经通过$vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id拿到了正确的虚拟机对象,后续新增的$vm = get-azvm | ? {$_.name -eq $vm}是拿虚拟机对象和name字符串属性做匹配,永远返回空值,导致后续磁盘相关字段赋值全部失败。
  • 错误2:当前Azure主流使用托管磁盘,不存在Vhd.uri属性,直接读取该属性自然为空,需要适配托管磁盘的属性取值逻辑。
  • 错误3:初始声明$info对象时未包含OSDiskSizeGB字段,即使后续赋值也不会导出到最终结果中。
  • 错误4:$location变量被注释,导致Get-AzVMSize查询时参数为空,存在报错风险。
  • 错误5:多余的foreach ($vms in $vm)循环无意义,$vm本身就是单个虚拟机对象,不需要额外遍历。
  • 错误6:导出CSV时默认会保留类型信息头,建议加-NoTypeInformation参数规避无用内容。
修正后的脚本
$reportName = "sample.csv"
$report = @()
# 预查询所有VM、公网IP、网卡,避免循环内重复调用接口
$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | Where-Object { $_.VirtualMachine -ne $null} 

foreach ($nic in $nics) { 
    # 新增OSDiskSizeGB字段
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VmSize, VirturalNetwork, Subnet, DnsServers, NicDns, PrivateIpAddress, OsType, OSDisk, OSDiskSizeGB, DiagDisk, DataDisk, PublicIPAddress, vCPU, Memory
    # 匹配网卡对应的VM
    $vm = $vms | Where-Object -Property Id -eq $nic.VirtualMachine.id 
    # 匹配公网IP
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.Id -eq $publicIp.IpConfiguration.Id) {
            $info.PublicIPAddress = $publicIp.IpAddress
        } 
    } 
    # 启用location变量赋值
    $location = $vm.Location
    $info.OsType = $vm.StorageProfile.OsDisk.OsType 
    $info.VMName = $vm.Name 
    $info.ResourceGroupName = $vm.ResourceGroupName 
    $info.Region = $location
    $info.VmSize = $vm.HardwareProfile.VmSize
    $size = $info.VmSize
    # 取对应规格的CPU和内存
    $vmSizeInfo = Get-AzVMSize -Location $location | Where-Object {$_.Name -eq $size}
    $info.vCPU = $vmSizeInfo.NumberOfCores
    $info.Memory = $vmSizeInfo.MemoryInMB
    # 网络相关信息赋值
    $info.VirturalNetwork = $nic.IpConfigurations.Subnet.Id.Split("/")[-3] 
    $info.Subnet = $nic.IpConfigurations.Subnet.Id.Split("/")[-1] 
    $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress 
    # 磁盘信息适配托管磁盘
    $info.OSDiskSizeGB = $vm.StorageProfile.OsDisk.DiskSizeGB
    # 托管磁盘取磁盘名,非托管磁盘取VHD URI
    if ($vm.StorageProfile.OsDisk.ManagedDisk) {
        $info.OSDisk = $vm.StorageProfile.OsDisk.Name
    } else {
        $info.OSDisk = $vm.StorageProfile.OsDisk.Vhd.Uri
    }
    # 诊断存储账户赋值
    if ($vm.DiagnosticsProfile.BootDiagnostics.Enabled) {
        $info.DiagDisk = $vm.DiagnosticsProfile.BootDiagnostics.StorageUri
    }
    # 数据磁盘适配,多个用**分隔
    $dataDiskList = @()
    foreach ($dataDisk in $vm.StorageProfile.DataDisks) {
        if ($dataDisk.ManagedDisk) {
            $dataDiskList += $dataDisk.Name
        } else {
            $dataDiskList += $dataDisk.Vhd.Uri
        }
    }
    $info.DataDisk = $dataDiskList -join "**"
    $report += $info 
} 
# 输出预览
$report | Format-Table VmName, ResourceGroupName, Region, VmSize, VirturalNetwork, Subnet, DnsServers, NicDns, PrivateIpAddress, OsType, OSDisk, OSDiskSizeGB, DiagDisk, DataDisk, PublicIPAddress, vCPU, Memory 
# 导出CSV加NoTypeInformation参数,指定UTF8编码避免中文乱码
$report | Export-Csv "c:\temp\$reportName" -NoTypeInformation -Encoding UTF8

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:15:05