Windowsbatch file获取C:\驱动器的总空间和可用空间

我需要一个bat文件来在Windows系统中获得C:\驱动器的总空间和GB(千兆字节)的可用空间,并创build一个包含详细信息的文本文件。

注意:我不想使用任何外部实用程序。

以字节为单位剪切大小的9位数字,以GB为单位获得大小:

@echo off & setlocal ENABLEDELAYEDEXPANSION SET "volume=C:" FOR /f "tokens=1*delims=:" %%i IN ('fsutil volume diskfree %volume%') DO ( SET "diskfree=!disktotal!" SET "disktotal=!diskavail!" SET "diskavail=%%j" ) FOR /f "tokens=1,2" %%i IN ("%disktotal% %diskavail%") DO SET "disktotal=%%i"& SET "diskavail=%%j" (ECHO(Information for volume %volume% ECHO(total %disktotal:~0,-9% GB ECHO(avail. %diskavail:~0,-9% GB)>size.txt TYPE size.txt 

cmd只能计算最多2^31-1 (2,147,483,647〜2.000001千兆字节)

不是一个完整的解决方案,但有人可能会觉得这有帮助:

 dir | find "bytes" 

这可能不是你想要的,因为它使用PowerShell,但“外部工具”有点模糊,给我留下了一些回旋余地。 另外,它本质上是一个单线。

 SETLOCAL FOR /F "usebackq tokens=1,2" %%f IN (`PowerShell -NoProfile -EncodedCommand "CgBnAHcAbQBpACAAVwBpAG4AMwAyAF8ATABvAGcAaQBjAGEAbABEAGkAcwBrACAALQBGAGkAbAB0AGUAcgAgACIAQwBhAHAAdABpAG8AbgA9ACcAQwA6ACcAIgB8ACUAewAkAGcAPQAxADAANwAzADcANAAxADgAMgA0ADsAWwBpAG4AdABdACQAZgA9ACgAJABfAC4ARgByAGUAZQBTAHAAYQBjAGUALwAkAGcAKQA7AFsAaQBuAHQAXQAkAHQAPQAoACQAXwAuAFMAaQB6AGUALwAkAGcAKQA7AFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAoACQAdAAtACQAZgApACwAJABmAH0ACgA="`) DO ((SET U=%%f)&(SET F=%%g)) @ECHO Used: %U% @ECHO Free: %F% 

由于批处理/ CMD在几乎所有方面都是不好的,所以我决定使用PowerShell,这是为了这样的东西,并且可以快速,方便地访问WMI。

这是PowerShell代码:

 Get-WMIObject -Query "SELECT * FROM Win32_LogicalDisk WHERE Caption='C:'" ` | % { $f = [System.Math]::Round($_.FreeSpace/1024/1024/1024,1); $t = [System.Math]::Round($_.Size/1024/1024/1024,1); Write-Host ('' + ($t-$f) + ',' + $f); } 

这吐出了由逗号分隔的两个值。 现在,只要我们可以在FOR循环中做到这一点!

PowerShell具有很好的接受Base64编码命令的能力(消除了转义和使代码难以读取的需要),所以我们所需要做的就是尽可能地缩小这个命令(以减小编码的大小字符串严格地说是一个好的,不是绝对必要的)。 我也把大小缩小到整数,把它们四舍五入。 它至少比舍弃低位十进制数字更接近。

缩小编码的命令并在PowerShell中对其进行编码如下所示:

 $code = { gwmi Win32_LogicalDisk -Filter "Caption='C:'"|%{$g=1073741824;[int]$f=($_.FreeSpace/$g);[int]$t=($_.Size/$g);Write-Host ($t-$f),$f} } $enc = [convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code)) Write-Host $enc 

(有关更多详细信息,请参阅PowerShell /?)。

我希望这可以在任何Win7或Win8机器上运行。 PoSH代码不依赖于任何高级功能(除了可能的EncodedCommand位),所以如果PoSH安装在XP或Vista机器上,它很有可能工作。 我不能说通过Windows更新推动PoSH的MS历史,但我认为这是一个很好的机会,无处不在。

这应该批量工作:

 for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set space=%%S echo %space%