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

Posted

技术标签:

【中文标题】有没有办法在磁盘上批量输出文件大小?【英文标题】:Is there a way to output file size on disk in batch? 【发布时间】:2015-06-17 13:37:44 【问题描述】:

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

我试过了:

(在批处理文件中)

echo %~z1

,

for %i in (TestFile.txt) do echo %~zi

,

dir

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

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

【问题讨论】:

【参考方案1】:

有趣的问题。我不知道磁盘值的大小是任何可编写脚本对象的属性。您可以通过获取文件大小以每簇字节为模数,从文件大小中减去该模数,然后添加簇大小来计算它。 (编辑:或使用 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%

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

感谢 JosefZ、Marged 和 Aacini 提供的所有意见!

【讨论】:

使用Bytes Per Cluster(例如4096)而不是Bytes Per Physical Sector(例如512)。 (在我的 tiny SSD 上验证)。然后set /a ondisk = (fs / clus +1)* clus) 我采取了使用通配符的懒惰方式。这是相同的结果。 :) @loadingnow 您的批处理将始终在英文 Windows 上运行? @rojo:我使用的是 Windows 8.1 西班牙语。我需要管理员凭据才能运行 fsutil,但它在第 10 行显示 Bytes por clúster: 4096 值(skip=9)。您的wmic path win32_volume get name,blocksize /format:csv 正确显示集群大小:COMPAQCQ45,4096,C:\ 你也可以这样计算磁盘空间:set /a ondisk = ( (fs-1)/cluster+1 ) * cluster【参考方案2】:

这不是一个答案,只是@rojo 要求的值:

NTFS-Volumeseriennummer             0xacf01e6ef01e3ed0
NTFS-Version :                           3.1
LFS-Version    :                  2.0
Anzahl der Sektoren :               0x000000000ed737ff
Gesamtzahl Cluster :                0x0000000001dae6ff
Freie Cluster :                     0x00000000008c8d41
Insgesamt reserviert :              0x0000000000000f70
Bytes pro Sektor  :                 512
Bytes pro physischem Sektor :       512
Bytes pro Cluster :                 4096
Bytes pro Dateidatensatzsegment   : 1024
Cluster pro Dateidatensatzsegment : 0
Gültige MFT-Datenlänge :            0x000000001c1c0000
MFT-Start-LCN  :                    0x00000000000c0000
MFT2-Start-LCN :                    0x0000000000000002
MFT-Zonenstart :                    0x00000000018a8ee0
MFT-Zonenende   :                   0x00000000018b12e0
Ressourcen-Manager-Bezeichner:        A81246B1-33B0-11E4-A94B-AEB4ABF863CB

这是来自德语 Windows 8.1。 我认为如果有必要使批处理语言环境独立,则不能采用 grepping 方法。相反,使用脚本主机编写适当的文件系统对象将是一种解决方案。

WMIC 命令有这个结果...

SOMENAME,4096,C:\

...加上我不需要以管理权限运行此命令的优点。

【讨论】:

谢谢玛格德。只要你愿意做我的心腹,你能不能跑wmic path win32_volume get name,blocksize /format:csv | findstr /i "c:"告诉我返回的值是否包含4096? @rojo 更新了我的答案,正如预期的那样,这也适用于德语 Windows。或许可以通过某种方式添加“where name=C:”或类似于 wmic 查询。尽管您的脚本很棒,但我认为这是一个边缘案例,人们可能会考虑从批处理切换到改进的脚本。 JosefZ 提出了同样的建议。我添加了建议的更改,只是废弃了整个 fsutil 方法。 @rojo 干得好!你是一时的英雄!抱歉OT 评论(不足的赞成票) @Marged 改进了脚本,例如powershell "$f = gi Testfile.txt; $s = $f.Length; $d = $f.FullName.split('\')[0]; 'Size: '+$s; gwmi win32_volume | where $_.caption -match $d | select blocksize | % $b = $_.blocksize; $o = [int](($s - 1) / $b + 1) * $b; 'Size on disk: '+$o" 你的意思是? 咧嘴【参考方案3】:

寻找相同问题的答案,我刚刚找到了这个:http://www.ltr-data.se/opencode.html/sizeof 工具就是这样做的。

sizeof,Olof Lagerkvist 的免费软件。 http://www.ltr-data.se 邮箱: olof@ltr-data.se 更多信息,包括分发权限和 源代码可在网站上找到。

此工具显示磁盘上文件和文件的总分配大小 目录。

命令行语法:sizeof [-xo] [-presentation] file1 [file2 ...]

-x 不要跟随连接点或其他重解析点。这确保了 sizeof 保留在它开始搜索的文件系统中。

-o 包括离线文件的大小。

-c 计算并显示每个找到的目录中的文件数,而不是 计算并显示它们的大小。

演示文稿确定以哪种格式显示 文件和目录。参数可以是以下任何一种:

-b 512 字节块的数量。 -h 人类可读的格式。 -k 千字节。 -m 兆字节。 -g 千兆字节。 -t TB。

它比此页面上提出的其他一些解决方案更好,因为它提供了正确的“磁盘大小”(顺便说一下,应该将其重命名为“分区大小”或“存储设备大小”,因为现在许多存储设备都是不是“磁盘”)用于压缩或稀疏文件。我正是想比较 NTFS 压缩和“稀疏”对于从文件共享软件部分下载的一堆大文件的效果;所以我将首先使用sizeof 来获取当前压缩的那些文件的实际分配大小,然后我将解压缩它们,然后将它们转换为“稀疏”,然后再次运行sizeof

我只发现了一个实用程序,它可以将非稀疏文件转换为稀疏文件,并实际上取消分配其空扇区:一个名为SparseTest 的命令行工具,它于 10 多年前发布,“用于仅用于演示”,并且似乎很久以前就消失了,但在那里仍然可用:https://web.archive.org/web/20151103231305if_/http://pages.infinit.net/moonligh/eMule/Releases/SparseTest.zip

SparseTest 还在应用“sparse”属性之前显示“磁盘大小”(但输出更复杂,因此如果需要该信息用于进一步的目的,则在批处理脚本中使用它并不容易)。它会计算前后的校验和,以确保在此过程中保留文件的完整性(我仍然建议先进行备份,然后使用其他工具(如 WinMerge 或 MD5Checker)验证所有文件是否严格相同)。与以蓝色显示的具有“C”属性的文件相反,除了“属性”列中的“P”(它甚至没有出现在“属性”中)之外,没有什么可以将“稀疏”文件与常规文件区分开来。

Windows 原生工具fsutil 可以设置sparse 属性,但它实际压缩文件,它的“磁盘大小”保持不变,即使它包含很多空扇区;只有当文件大小后来增加了空扇区时,它们才会以“稀疏”方式添加,即作为元数据存储而不是实际分配。

【讨论】:

以上是关于有没有办法在磁盘上批量输出文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取目录C ++的磁盘大小

Python - 批量获取文件夹的大小输出为文件格式化保存

用bat怎样批量提取图片的分辨率或像素大小、文件大小,大神们帮帮忙,谢谢了。

matlab批量读取文件夹里面的文件名,并且调整图片大小,再按照原名称输出

提前以编程方式确定文件“磁盘上的大小”

如何获取视频 PHAsset 磁盘文件大小?