如何在Windows批处理脚本中检查文件大小?

73

我想要一个批处理文件,它可以检查文件的filesize

如果文件大小大于%somany% kbytes,它应该使用GOTO重定向到其他地方。

例如:

[check for filesize]
IF %file% [filesize thing Bigger than] GOTO No
echo Great! Your filesize is smaller than %somany% kbytes.
pause
exit
:no
echo Um... You have a big filesize.
pause
exit
14个回答

1

我刚看到这个旧问题,想知道Windows是否有内置的东西。 ~z 的东西是我不知道的,但对我不适用。最终我使用了Perl的一行代码:

@echo off

set yourfile=output.txt
set maxsize=10000

perl -e "-s $ENV{yourfile} > $ENV{maxsize} ? exit 1 : exit 0"
rem if %errorlevel%. equ 1. goto abort
if errorlevel 1 goto abort

echo OK!
exit /b 0

:abort
echo Bad!
exit /b 1

0
需要注意的是批处理的INT32限制:“无效数字。数字仅限于32位精度。”
请尝试以下语句:
IF 2147483647 GTR 2147483646 echo A is greater than B (will be TRUE)
IF 2147483648 GTR 2147483647 echo A is greater than B (will be FALSE!)

任何大于最大INT32值的数字都会破坏脚本!由于文件大小是以字节为单位测量的,因此脚本将支持最大约为255.9999997615814 MB的文件大小!


这是不正确的。我创建了一个5 GB的文件,并能够使用%~z1读取它的文件大小,它报告了5056590344。 - Stephen Quan
1
这是因为它仍然是一个字符串,没有转换成数字。尝试使用Set /A进行比较或算术运算,任何大于2 GB的内容都将失败。 - Bilbo
在将NTFS转换为FAT32时,重要的是确定哪些文件超过了4GB的限制。虽然Windows资源管理器允许搜索“size:>4GB”,但我更喜欢有文本输出结果。事实上,Windows 10仍然具有INT32 CLI和BATCH限制2^31。使用逻辑:“显示需要处理的F:驱动器上的所有文件:”- @for /f "tokens=*" %F in ('dir /s /b /a:-d f:\') do @IF %~zF geq 4294967296 ECHO %F >> FindFilesTooLargeForFAT32.txt。输出的是超过2GB(而不是256MB)的文件。2^31 = 32位 = 2,147,483,648 = 2GB(技术上是GiB gibibyte 1024 ^ 3 * 2)。 - Page2PagePro
解决方法是:使用资源管理器筛选视图(即:size:>4GB),Ctrl+A,Shift r-click,Copy As Path,粘贴到Notepad++中,使用TextFX工具进行升序排序(因为Copy As Path不会反映UI中显示的顺序)。 - Page2PagePro
我们可以通过将其作为填充字符串比较来避免 INT32 问题。 - Stephen Quan

0

你需要两件事情。

filesize.bat 

@echo off
echo %~z1

然后你实际上想要评估的是什么。

仅在文件大于零时复制文件/仅复制非零文件

for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )

我找到了这个帖子,它几乎是我所需要的,我尝试了很多不同的方法 - 这让我有点沮丧,因为robocopy看起来有/min:1,但由于我想在传输过程中重命名文件,它变得一团糟,这让我不得不使用该死的批处理脚本。

-5

一个想法:

你可以通过运行命令“dir”来获取文件大小:

>dir thing

然而,它返回了很多东西。

如果你寻找它,也许你可以从那里得到它。

但我不确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接