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

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
    }
}

关键修复点

  1. 避免整数除法:将1TB、1GB转换为[double]类型,强制进行浮点除法,确保单位判断逻辑准确
  2. 使用原始值判断:始终用$rawUsed(原始字节数)进行单位判断,避免变量被修改后影响后续逻辑
  3. 定义缺失变量:在函数内定义$lineBreak和$separator,避免运行时错误
  4. 优化输出格式:调整Write-Host的写法,让输出更清晰易读

额外建议

  • 如果需要支持十进制单位(如1GB=10^9字节),可以使用[System.Math]::Pow(10,9)替代1GB
  • 可以添加对$rawUsed为$null的判断(如网络驱动器),避免运算错误

内容的提问来源于stack exchange,提问作者mimi m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:55:54