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

