PowerShell中磁盘空间TB/KB/GB转换异常,全部显示为GB
问题排查与修复
你的代码出现全部显示GB单位的核心原因是整数除法导致的判断逻辑失效,以及一些潜在的变量问题,具体分析和修复如下:
核心问题分析
PowerShell中,当两个整数类型的值相除时,默认执行整数除法(截断小数部分)。例如:
- 如果磁盘已用空间是1.2TB(字节数),
$usedSpace / 1TB的整数运算结果是1而非1.2,此时1 -gt 1不成立,会跳过TB分支进入GB分支,导致本该显示TB的磁盘被错误转换为GB - 对于小于1GB的磁盘,
$usedSpace / 1GB的整数运算结果是0,本应进入KB分支,但如果你的测试磁盘没有小于1GB的,就会出现全部显示GB的情况
另外,代码中$lineBreak和$separator变量未定义,会导致运行时错误(除非函数外已提前定义)。
修复后的代码
Function Read-DiskInfo { # retrieves a list of all available disk drives Get-PSDrive -PSProvider 'FileSystem' | Select-Object -Property Name, Used, Free } Function Get-DiskInfo { # returns information about a specified disk drive $diskDrives = Read-DiskInfo $lineBreak = "`n" $separator = "-------------------------" Write-Host 'Disk Drive Information:' -ForegroundColor Green; $lineBreak foreach ($disk in $diskDrives) { $diskName = $disk.Name $rawUsed = $disk.Used $rawFree = $disk.Free # 使用浮点运算避免整数除法问题,始终基于原始字节值判断 if ($rawUsed / [double]1TB -gt 1) { $usedSpace = [math]::round($rawUsed / 1TB, 2) $freeSpace = [math]::round($rawFree / 1TB, 2) $unit = '(TB)' } elseif ($rawUsed / [double]1GB -gt 1) { $usedSpace = [math]::round($rawUsed / 1GB, 2) $freeSpace = [math]::round($rawFree / 1GB, 2) $unit = '(GB)' } else { $usedSpace = [math]::round($rawUsed / 1KB, 2) $freeSpace = [math]::round($rawFree / 1KB, 2) $unit = '(KB)' } $totalSpace = $usedSpace + $freeSpace Write-Host "Disk Label $unit : " -ForegroundColor Green -NoNewline Write-Host $diskName Write-Host "Used Space $unit : " -ForegroundColor Green -NoNewline Write-Host $usedSpace Write-Host "Available Space $unit : " -ForegroundColor Green -NoNewline Write-Host $freeSpace Write-Host "Total Space $unit : " -ForegroundColor Green -NoNewline Write-Host $totalSpace if ($diskDrives.Count -gt 1) { Write-Host $separator } Write-Host $lineBreak } }
关键修复点
- 避免整数除法:将
1TB、1GB转换为[double]类型,强制进行浮点除法,确保单位判断逻辑准确 - 使用原始值判断:始终用
$rawUsed(原始字节数)进行单位判断,避免变量被修改后影响后续逻辑 - 定义缺失变量:在函数内定义
$lineBreak和$separator,避免运行时错误 - 优化输出格式:调整
Write-Host的写法,让输出更清晰易读
额外建议
- 如果需要支持十进制单位(如1GB=10^9字节),可以使用
[System.Math]::Pow(10,9)替代1GB - 可以添加对
$rawUsed为$null的判断(如网络驱动器),避免运算错误
内容的提问来源于stack exchange,提问作者mimi m
相关产品推荐
相关产品推荐

