在批处理文件中获取磁盘/分区大小

在批处理文件中获取磁盘/分区大小

如何获得总大小批处理文件中的磁盘或分区(带有 1 个 NTFS 分区的 USB 硬盘)?
我宁愿不使用递归遍历文件的逻辑(带有 /f 的逻辑),因为它是一个 1TB 的驱动器,可能需要很长时间才能确定大小。

我愿意使用一些小型的第三方工具来将大小返回到批处理文件。

PS:我使用的是 Windows 7 x64 Ultimate

答案1

可能有更简单的方法可以做到这一点,但我使用的方法如下

如果您想要的只是字节,您只需执行此命令将 T 更改为外部驱动器的驱动器号(在命令提示符下使用一行更改%%%并将set space=更改为echo

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

如果你想简化它,首先为每种尺寸设定指导方针

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

然后编写一个临时的 VBS 脚本,因为批处理无法处理数学

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

运行它,捕获结果并删除它

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

然后以下将结果修剪到小数点后两位

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

回显结果

echo Drive has %space% %size% free.

[编辑]

为了全部的大小,您可以使用 diskpart list volume (更改"%%a"=="T""%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

以及你如何计算:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0

答案2

df.exe也许可以尝试http://unxutils.sourceforge.net/和其他位置。这是 UNIX 命令行工具的副本。

您还应该能够直接从 Windows 管理界面 (WMI) 获取值,但恐怕我在这方面的技能不足以给出直接的答案。

fsutil volume diskfree c:将为您提供 3 行输出,您可能需要使用 a findon 来获得想要的结果。

示例输出:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes"给你一条具体的线。

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

给出带有空格的数字。

为了比较:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

注意:fsutil 需要管理员权限,因此它可能无法在锁定的计算机上运行。

相关内容