PowerShell磁盘检查报告脚本空间值错误运行失败求助
PowerShell磁盘检查脚本故障修复
核心故障原因
脚本持续运行失败由3个明确问题导致:
- 变量引用笔误:计算磁盘剩余占比的
Status字段中,错误使用了从未定义的$db变量指代当前磁盘对象,实际ForEach管道内的当前对象为$_,空变量参与数值运算会直接触发取值异常 - 缺少边界容错:
Win32_Volume类会枚举系统保留分区、恢复分区等无盘符的特殊卷,这类卷的Size属性可能为0或空值,直接做除法会触发除零、空值运算错误 - 语法小瑕疵:原脚本替换双引号的语句中
$_-replace缺少运算符前空格,部分老版本PowerShell会触发解析错误 - 额外兼容性提示:
Get-WmiObject已在新版PowerShell中被标记为过时,远程查询稳定性弱于官方推荐的替代命令Get-CimInstance
修复后完整代码
$Computers = Get-Content -Path C:\Users\gbekari\unbackup\Servers.txt $results = foreach ($Computer in $Computers){ # 如需兼容PowerShell 2.0等极老版本,可将Get-CimInstance换回Get-WmiObject Get-CimInstance Win32_Volume -Filter "DriveType='3'" -ComputerName $Computer | ForEach-Object { # 跳过大小为空/为0的无效特殊分区,避免运算报错 if (-not $_.Size -or $_.Size -eq 0) { return } $freePercent = [Math]::Round(100 * $_.FreeSpace / $_.Size, 2) [PSCustomObject]@{ Computername = $computer date = Get-Date -format "dd.MM.yy HH:mm" size = [Math]::Round($_.Size /1GB,2) freeSpace = [Math]::Round($_.FreeSpace /1GB,2) Status = if ($freePercent -ge 20 ) {'NONE'} else {'Warning'} empty = "Diskcheck" } } } $results | ConvertTo-Csv -NoTypeInformation -Delimiter "|" | ForEach-Object { $_ -replace '"','' } | Set-Content -Path C:\Users\gbekari\unbackup\Sers.txt
修复说明
- 修正了状态计算时的变量引用错误,统一使用当前管道对象
$_取值 - 增加无效分区过滤逻辑,跳过大小为0/空的系统特殊卷,从根源避免运算报错
- 提前计算剩余空间占比变量,简化判断逻辑:剩余占比≥20%标记为
NONE,低于20%标记为Warning,完全匹配高亮标注需求 - 替换冗余的
New-Object PSObject写法为更简洁的[PSCustomObject]类型加速器,执行效率更高 - 修正了替换语句的语法空格问题,兼容全版本PowerShell解析规则
内容的提问来源于stack exchange,提问作者user18970328
相关产品推荐
相关产品推荐

