Windows批处理文件获取C:\驱动器总空间和可用空间

时间:2013-06-22 22:30:43

标签: windows batch-file cmd size volume

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

注意:我不想使用任何外部工具。

4 个答案:

答案 0 :(得分:4)

按字节剪切大小的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千兆字节)的数字进行计算

答案 1 :(得分:3)

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

dir | find "bytes"

答案 2 :(得分:1)

这可能根本不是你想要的,因为它使用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位),因此如果在XP或Vista机器上安装PoSH,它很有可能工作。我不能谈论MS通过Windows Update推送PoSH的历史,但我认为这很有可能无处不在。

答案 3 :(得分:0)

这应该是批处理的:

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