我是命令行编程的新手,并且有我想要创build的脚本。 我需要做的一件事就是确定一个文件夹内容的大小,然后用一个variables保存数值,以便稍后进行比较。
我正在运行Windows 7命令行,有些文件可能大于2GB。
感谢您提供的任何帮助。
纯粹的本地批处理解决这个简单的问题是多么的困难。
编辑 – 这个答案已被编辑,包括所有子文件夹的累积文件大小。
DIR / S命令给出文件夹及其子文件夹中所有文件的总大小,但是输出会根据您的计算机语言环境设置(语言)而改变。 FIND命令可以隔离包含文件夹大小的行,FOR / F用于解析结果。 每个文件夹有一个“File(s)”行,加上包含总计的最后一个条目。 最后的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
以上将不得不改变为不同的地区。 例如,“文件”会因不同的语言而改变,有些国家使用“。” 而不是“,”作为成千上万的分隔符。
但是,如果您想稍后将其大小与其他值进行比较,那么这只能让您获得一半的结果,因为IF语句只能比较大到2147483647(〜2千兆字节)的数字。 任何大于2147483647的数字都将被视为2147483647.围绕该问题的解决方法是将数字填充为零,使得“保证”的宽度比任何数字都要大。 然后强制IF通过在比较中包含非数字字符来进行字符串比较。 我喜欢使用数字宽度为15位(〜999千兆字节)的引号。
@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/ 。
在robocopy / L src dst的一行的开始处搜索字符串文字“Bytes” 。 / L将防止复制实际文件并将其设置为局部变量
另一种方式是使用compact /s
.compact工具,不用翻译,应该以相同的方式在每台Windows机器上工作:
@echo off pushd "%~1" for /f %%s in ('compact /s ^| find " total bytes"') do ( set _size=%%s ) echo folder size is : %_size:,=% bytes popd