1

我是命令行编程的新手,并且有一个我想创建的脚本。我需要做的一件事是确定文件夹内容的大小并将数值与变量一起保存以供以后比较。

我正在运行 Windows 7 命令行,有些文件可能大于 2GB。

感谢您提供的任何帮助。

4

3 回答 3

3

使用纯原生批处理来解决这个简单的问题是多么困难,令人惊讶。

编辑 - 此答案已被编辑为包括所有子文件夹的累积文件大小。

DIR /S 命令给出文件夹及其子文件夹中所有文件的总大小,但输出会根据您的计算机区域设置(语言)而变化。FIND 命令可以隔离包含文件夹大小的行,FOR /F 用于解析结果。每个文件夹有一个“文件”行,外加一个包含总计的最终条目。最后一个 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/

于 2013-03-03T17:13:51.323 回答
0

在 robocopy /L src dst 的行首搜索字符串文字“Bytes” , /L 将阻止实际文件被复制并将其设置为局部变量

于 2013-11-01T01:34:56.353 回答
0

另一种方法是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
于 2013-11-07T12:51:23.193 回答