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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:23:16