我是命令行编程的新手,并且有一个我想创建的脚本。我需要做的一件事是确定文件夹内容的大小,并使用变量保存数值以供稍后比较。
我正在运行 Windows 7 命令行,一些文件可能大于 2GB。
感谢您提供的任何帮助。
最佳答案
令人惊奇的是,用纯原生批处理解决这个简单的问题是多么困难。
编辑 - 此答案已编辑为包括所有子文件夹的累积文件大小。
DIR/S 命令给出文件夹及其子文件夹中所有文件的总大小,但输出会根据您计算机的区域设置(语言)而变化。 FIND 命令可以隔离包含文件夹大小的行,并使用 FOR/F 来解析结果。每个文件夹有一个"file"行,加上包含总计的最后一个条目。最后一个 SET 命令将取代先前的值。最后,使用变量扩展搜索和替换来消除千位分隔符。
这将获取美国机器上给定文件夹内的总字节数。文件夹的路径应在第一个参数中提供。采用 ”。”对于当前目录。
@echo off
setlocal
for /f "tokens=3" %%A in ('dir "%~1\"^|find "File(s)"') do set size=%%A
set "size=%size:,=%"
echo Folder "%~f1" contains %size% bytes
以上内容必须针对不同的语言环境进行更改。例如,“File(s)”会因不同的语言而变化,有些国家使用“.”。而不是“,”作为千位分隔符。
但是,如果您想稍后将大小与其他值进行比较,那只能让您完成一半,因为 IF 语句只能比较大至 2147483647(~2 GB)的数字。任何大于 2147483647 的数字都被视为 2147483647。解决该问题的方法是用零将数字左侧填充到“保证”大于您将遇到的任何数字的恒定宽度。然后强制 IF 通过在比较中包含非数字字符来进行字符串比较。我喜欢使用数字宽度为 15 位数字(~999 TB)的引号。
@echo off
setlocal
for /f "tokens=3" %%A in ('dir "%~1\"^|find "File(s)"') do set size=%%A
set "size=%size:,=%"
echo Folder "%~f1" contains %size% bytes
:: Left pad the width to 15 digits
set "paddedSize=000000000000000%size%"
set "paddedSize=%paddedSize:~-15%"
:: Compare the size to 1 Terabyte
if "%paddedSize%" gtr "001099511627776" echo The folder is larger than 1 Terabyte
注意:DIR 命令在计算总文件大小时忽略备用数据流。备用数据流是可以与 NTFS 卷上的文件相关联的隐藏内容。参见 http://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/获取更多信息。
关于Windows 命令行 - 确定文件夹内容大小并保存为数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186704/