有没有办法批量输出磁盘上的文件大小?

loa*_*now 6 file batch-file filesize

有没有办法在属性窗口中获取文件的磁盘大小:

我试过了:

(在批处理文件中)

echo %~z1
Run Code Online (Sandbox Code Playgroud)

,

for %i in (TestFile.txt) do echo %~zi
Run Code Online (Sandbox Code Playgroud)

,

dir
Run Code Online (Sandbox Code Playgroud)

但它们只返回文件的大小.

有没有办法像在属性窗口中看到的那样获得"磁盘大小"?

roj*_*ojo 5

有趣的问题.我不知道磁盘值的大小是任何可编写脚本的对象的属性.您可以通过获取文件大小模数每个群集,从文件大小中减去该模数,然后添加群集大小来计算它.(编辑:或使用Aacini更有效的计算,我仍然试图理解.)

@echo off
setlocal

for %%I in (Testfile.txt) do (
    set "fs=%%~zI"
    for /f %%J in (
        'wmic volume where "driveletter='%%~dI'" get blocksize /value'
    ) do 2>nul set /a %%J
)

echo Size: %fs%

set /a ondisk = ((fs-1)/blocksize+1) * blocksize

echo Size on disk: %ondisk%
Run Code Online (Sandbox Code Playgroud)

许多网站声称这fsutil fsinfo ntfsinfo DRIVE:是获得每个群集的字节数的最佳方式.看起来这种方法充满了危险,不同的标签取决于区域设置和不同版本的Windows的不同行数.此外,正如Marged所说,fsutil需要提升.这种WMI方法似乎更普遍,并且不需要管理员权限.

感谢JosefZ,Marged和Aacini的所有投入!

  • 使用"每个字节的字节数"(例如4096)而不是"每个物理扇区的字节数"(例如512).(在我的_tiny_ SSD上验证).然后`set/a ondisk =(fs/clus +1)*clus)` (2认同)
  • @rojo:我使用的是Windows 8.1西班牙语.我需要管理员凭据来运行`fsutil`,但它在第10行显示`Bytesporclúster:4096`值(skip = 9).你的`wmic path win32_volume获取名称,blocksize/format:csv`正确显示簇大小:COMPAQCQ45,4096,C:\ (2认同)
  • 您也可以通过这种方式在一行中计算磁盘空间:`set/a ondisk =((fs-1)/ cluster + 1)*cluster` (2认同)