Windows 命令行 - 确定文件夹内容大小并保存为数值

标签 windows command-line command size directory

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

我正在运行 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/

相关文章:

c# - Windows 窗体中的原生外观(类似资源管理器)主菜单

windows - 如何检查当前驱动器是否在本地磁盘(cmd)上?

windows - 我应该使用哪个 Windows SVN 服务器?

linux - Ubuntu Linux-Maverick-是否可以在命令行中找到用户名/文件路径并将其作为参数传递?

powershell - 使用 Plink 执行 (sudo) 子命令

grails - Grails无法运行

windows - 如何在 lua 中保存到剪贴板或从剪贴板保存(Windows)

python - 在Paramiko中执行curl时,其输出在stderr中,而不是stdout中

python - 在 Python 中使用命令模式执行/撤消

symfony - 从命令调用操作