Azure门户:多订阅托管磁盘可用空间查看及PS脚本咨询
Azure 跨订阅磁盘可用空间查看方法及PowerShell脚本
一、Azure门户查看方式
1. 已挂载磁盘的可用空间
Azure磁盘本身的元数据不包含实时可用空间数据,需从挂载的VM操作系统中获取:
- 单VM查看:进入目标VM,左侧菜单选择监控 > 性能,点击「添加指标」,选择
Logical Disk Free Space(绝对空间)或Logical Disk Free Space %(百分比),可筛选对应磁盘查看。 - 跨VM/订阅批量查看:使用Azure Monitor工作簿,创建自定义工作簿整合多订阅VM的磁盘性能数据,前提是VM已安装Azure Monitor Agent并配置了性能计数器收集。
2. 未挂载磁盘
未挂载的磁盘未被操作系统使用,无可用/已用空间数据,仅能查看总容量:在Azure门户的「磁盘」视图中,添加磁盘大小(GB)列即可查看。
二、PowerShell脚本(跨订阅批量收集)
以下脚本会遍历所有订阅,收集已挂载磁盘的实时可用空间,同时列出未挂载磁盘的总容量,最终导出为CSV文件:
# 登录Azure账号 Connect-AzAccount # 遍历所有订阅,收集磁盘使用数据 $diskUsageReport = Get-AzSubscription | ForEach-Object { $currentSub = $_ Set-AzContext -Subscription $currentSub.Id | Out-Null # 处理已挂载到VM的磁盘 Get-AzVM | ForEach-Object { $vm = $_ $osDisk = Get-AzDisk -ResourceId $vm.StorageProfile.OsDisk.ManagedDisk.Id $dataDisks = $vm.StorageProfile.DataDisks | ForEach-Object { Get-AzDisk -ResourceId $_.ManagedDisk.Id } # Windows VM 磁盘数据收集 if ($vm.StorageProfile.OsDisk.OsType -eq "Windows") { try { $runResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName ` -VMName $vm.Name -CommandId 'RunPowerShellScript' ` -ScriptString "Get-Volume | Where-Object {`$_.DriveType -eq 'Fixed'} | Select-Object DriveLetter, FileSystemLabel, @{Name='SizeGB';Expression={[math]::Round(`$_.Size/1GB,2)}}, @{Name='SizeRemainingGB';Expression={[math]::Round(`$_.SizeRemaining/1GB,2)}}" $diskData = $runResult.Value[0].Message | ConvertFrom-Json foreach ($disk in $diskData) { # 匹配磁盘名称 $targetDisk = if ($disk.DriveLetter -and $osDisk.DiskName.StartsWith($disk.DriveLetter)) { $osDisk } else { $dataDisks | Where-Object { $_.DiskName -eq $disk.FileSystemLabel -or $_.DiskName -match $disk.FileSystemLabel } | Select-Object -First 1 } [PSCustomObject]@{ SubscriptionName = $currentSub.Name VMName = $vm.Name DiskName = $targetDisk.Name TotalSizeGB = $disk.SizeGB FreeSpaceGB = $disk.SizeRemainingGB FreeSpacePercent = [math]::Round(($disk.SizeRemainingGB / $disk.SizeGB)*100,2) DiskStatus = "Mounted" } } } catch { Write-Warning "无法收集VM $($vm.Name) 的磁盘数据: $_" } } # Linux VM 磁盘数据收集 elseif ($vm.StorageProfile.OsDisk.OsType -eq "Linux") { try { $runResult = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName ` -VMName $vm.Name -CommandId 'RunShellScript' ` -ScriptString "df -h --output=source,size,avail,pcent | grep -E '(/dev/sd|/dev/nvme)' | sed 's/%//g'" $diskLines = $runResult.Value[0].Message -split "`n" | Where-Object { $_ -match '/dev/' } foreach ($line in $diskLines) { $parts = $line -split '\s+' | Where-Object { $_ } $devName = $parts[0].Split('/')[-1] # 匹配磁盘名称 $targetDisk = if ($osDisk.DiskName -match $devName) { $osDisk } else { $dataDisks | Where-Object { $_.DiskName -match $devName } | Select-Object -First 1 } [PSCustomObject]@{ SubscriptionName = $currentSub.Name VMName = $vm.Name DiskName = $targetDisk.Name TotalSizeGB = $parts[1] -replace 'G','' FreeSpaceGB = $parts[2] -replace 'G','' FreeSpacePercent = $parts[3] DiskStatus = "Mounted" } } } catch { Write-Warning "无法收集VM $($vm.Name) 的磁盘数据: $_" } } } # 处理未挂载的磁盘 Get-AzDisk | Where-Object { $_.ManagedBy -eq $null } | ForEach-Object { [PSCustomObject]@{ SubscriptionName = $currentSub.Name VMName = "N/A (未挂载)" DiskName = $_.Name TotalSizeGB = $_.DiskSizeGB FreeSpaceGB = "N/A (未使用)" FreeSpacePercent = "N/A (未使用)" DiskStatus = "Unmounted" } } } # 导出结果到CSV文件 $diskUsageReport | Export-Csv -Path "Azure_Disk_Usage_Report.csv" -NoTypeInformation -Encoding UTF8 Write-Host "报告已导出到: $((Get-Item "Azure_Disk_Usage_Report.csv").FullName)"
三、注意事项
- 脚本依赖Azure PowerShell模块(Az.Compute、Az.Accounts),需确保已安装:
Install-Module -Name Az -AllowClobber -Scope CurrentUser - 需具备跨订阅的
Virtual Machine Contributor或等效权限,以及Microsoft.Compute/virtualMachines/runCommand/action权限 - 未挂载磁盘无可用空间数据,脚本中会标注为「N/A (未使用)」
- 若VM未运行或未启用Azure VM Agent,将无法收集已挂载磁盘的可用空间数据
内容的提问来源于stack exchange,提问作者progrAmmar
相关产品推荐
相关产品推荐

