我需要一个 bat 文件来获取 Windows 系统中以 GB(千兆字节)为单位的 C:\ 驱动器总空间和可用空间,并创建一个包含详细信息的文本文件。
注意:我不想使用任何外部实用程序。
我需要一个 bat 文件来获取 Windows 系统中以 GB(千兆字节)为单位的 C:\ 驱动器总空间和可用空间,并创建一个包含详细信息的文本文件。
注意:我不想使用任何外部实用程序。
按字节切割大小的 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 GB)的数字
无论如何都不是一个完整的解决方案,但有人可能会觉得这很有帮助:
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 机器上,它很有可能工作。我无法谈论 MS 通过 Windows 更新推动 PoSH 的历史,但我认为这很有可能会无处不在。
这应该批量工作:
for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set space=%%S
echo %space%