PowerShell计算含FSRM配额的磁盘剩余空间时配额总和变量为空问题
问题原因
- 核心错误是将
Format-Table这类格式化命令用于数据计算逻辑:Format-*系列cmdlet的作用仅为生成面向控制台展示的格式化输出对象,其表达式块内部的变量赋值默认不会同步到脚本父作用域,因此写在Expression中的$TotalQuotaSize += $_.Size逻辑完全不会生效。 - 未提前初始化
$TotalQuotaSize变量,即便赋值逻辑生效,也可能出现空值异常。
修复方案
拆分数据计算和格式化输出两个流程,不要在格式化命令中处理累加逻辑:
- 先初始化变量,遍历FSRM配额计算总大小
- 单独格式化输出配额列表用于查看
- 结合磁盘剩余空间计算你需要的实际可用容量
参考代码如下:
# 初始化总配额变量,单位为Byte $TotalQuotaSize = 0 # 获取所有FSRM配额,累加总大小同时保存配额列表 $QuotaList = Get-FsrmQuota | ForEach-Object { $TotalQuotaSize += $_.Size $_ } # 格式化输出配额列表(仅用于展示,不要把这段逻辑放到计算流程里) $QuotaList | Format-Table Path, @{Label="Size_GB"; Expression = { "{0:F2}" -f ($_.Size/1GB) }} # 原磁盘剩余空间获取逻辑 $RemainingSizeDisk = (Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'FreeSpace (GB)'; Expression= {([math]::Round(($_.FreeSpace / 1GB), 2)) }} | Measure-Object -Property 'FreeSpace (GB)' -Sum).Sum # 转换总配额为GB单位 $TotalQuotaSizeGB = [math]::Round($TotalQuotaSize / 1GB,2) # 此处可根据业务需求计算扣除配额后的实际剩余,比如需要扣除已分配未使用的硬配额,可额外累加所有配额的Usage字段计算即可
注意事项
- 如果需要按单块磁盘统计对应配额,需要给
Get-FsrmQuota添加路径筛选,匹配对应逻辑盘的盘符,避免多盘配额混合统计。 - 计算实际可用容量时注意区分FSRM的硬配额和软配额:软配额仅做告警不会限制写入,不需要计入扣除项。
内容的提问来源于stack exchange,提问作者Florian Pichery
相关产品推荐
相关产品推荐

