Batch file 如何在Windows批处理脚本中检查文件的大小?
我想要一个批处理文件,用于检查文件的Batch file 如何在Windows批处理脚本中检查文件的大小?,batch-file,filesize,Batch File,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 ex
文件大小
如果它大于%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
只是一个想法:
您可以通过运行命令“dir”获得文件大小:
然后它又返回了很多东西
如果你找的话,也许你可以从那里得到它
但我不确定。像往常一样,VBScript可供您使用
Set objFS = CreateObject("Scripting.FileSystemObject")
Set wshArgs = WScript.Arguments
strFile = wshArgs(0)
WScript.Echo objFS.GetFile(strFile).Size & " bytes"
另存为filesize.vbs
并在命令行中输入:
C:\test>cscript /nologo filesize.vbs file.txt
79 bytes
使用for
循环(批处理)获得返回结果。如果%file%
是一个输入参数,可以使用%zN
,其中N
是参数的编号
例如,atest.bat
包含
@echo %~z1
GetFileSize=%~z1
将显示第一个参数的大小,因此如果使用“test myFile.txt
”,它将显示相应文件的大小。%~z1
扩展到批处理文件的第一个参数的大小。看
C:\> call /?
及
简单的例子:
@ECHO OFF
SET SIZELIMIT=1000
SET FILESIZE=%~z1
IF %FILESIZE% GTR %SIZELIMIT% Goto No
ECHO Great! Your filesize is smaller than %SIZELIMIT% kbytes.
PAUSE
GOTO :EOF
:No
ECHO Um ... You have a big filesize.
PAUSE
GOTO :EOF
如果文件名用作批处理文件的参数,则只需%~z1
(1表示第一个参数)
如果文件名不是参数,则可以执行以下操作:
@echo off
setlocal
set file="test.cmd"
set maxbytesize=1000
FOR /F "usebackq" %%A IN ('%file%') DO set size=%%~zA
if %size% LSS %maxbytesize% (
echo.File is ^< %maxbytesize% bytes
) ELSE (
echo.File is ^>= %maxbytesize% bytes
)
@echo关闭
setlocal
set file=“test.cmd”
设置maxbytesize=1000
对于(“%file%”中的/F“usebackq”%%A,请设置大小=%%~zA
如果%size%LSS%maxbytesize%(
echo.File为^<%maxbytesize%字节
)否则(
echo.File为^>=%maxbytesize%字节
)
刚看到这个老问题,想看看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
这是我的解决方案,用于评估文件大小,而不使用VB/perl/etc,也不使用本机windows shell命令:
FOR /F "tokens=4 delims= " %%i in ('dir /-C %temp% ^| find /i "filename.txt"') do (
IF %%i GTR 1000000 (
echo filename.txt filesize is greater than 1000000
) ELSE (
echo filename.txt filesize is less than 1000000
)
)
不是最干净的解决方案,但它可以完成任务。另一个例子
FOR %I in (file1.txt) do @ECHO %~zI
我更喜欢使用DOS功能。我觉得更干净
SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file
GOTO :EOF
:FileSize
SET %~2=%~z1
GOTO :EOF
创建一行批处理文件GetFileSize.bat,其中包含
@echo %~z1
GetFileSize=%~z1
那就叫它
call GetFileSize myfile.txt
if (%GetFileSize) == () goto No_File
if (%GetFileSize) == (0) goto No_Data
if (%GetFileSize) GTR 1000 goto Too_Much_Data
rem Etc.
您甚至可以动态创建测试文件,以消除讨厌的必需文件,请注意echo语句中的双百分比:
echo set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
call %temp%\GetFileSize myfile.txt
if (%GetFileSize) GTR 1000 goto Too_Much_Data
rem etc
后一种解决方案是反帕切蒂。太好了。然而,更多的磁盘写入。检查使用计数。需要注意的重要一点是批次的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!)
任何大于max INT32值的数字都将中断脚本!由于文件大小是以字节为单位的,所以脚本将支持大约255.999997615814 MB的最大文件大小 我喜欢@Anders的回答,因为对%%z1秘酱的解释。
但是,正如所指出的,只有当文件名作为
批处理文件的第一个参数
@Anders通过为
使用,解决了这个问题,这是对
问题是,但是,它有点难读
相反,我们可以使用CALL
返回到一个简单的答案,使用%%z1。
如果将文件名存储在环境变量中,它将变为
%1如果将其用作批处理文件中例程的参数:
@echo关闭
setlocal
set file=test.cmd
设置maxbytesize=1000
调用:设置大小%file%
如果%size%lss%maxbytesize%(
回显文件小于%maxbytesize%字节
)否则(
回显文件大于或等于%maxbytesize%字节
)
后藤:eof
:设置大小
设置大小=%~z1
后藤:eof
我一直很好奇J.Bouvrie对32位限制的担忧。他似乎在谈论一个关于使用LSS
而不是文件大小逻辑本身的问题。为了解决J.Bouvrie的问题,我重写了使用填充字符串比较的解决方案:
@echo on
setlocal
set file=test.cmd
设置maxbytesize=1000
调用:设置大小%file%
设置checksize=00000000000000%size%
设置checkmaxbytesize=00000000000000%maxbytesize%
如果“%checksize:~-20%”lss“%checkmaxbytesize:~-20%”(
回显文件小于%maxbytesize%字节
)否则(
回显文件大于或等于%maxbytesize%字节
)
后藤:eof
:设置大小
设置大小=%~z1
后藤:eof
经过几次“尝试和测试”迭代之后,我找到了一种方法(这里仍然没有)来获取cycle变量中的文件大小(不是命令行参数):
你需要两样东西
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,但由于我想重命名传输中的文件,所以我不得不使用@#$!!批处理脚本。您能解释一下“usebackq”选项的帮助吗?它似乎与文件大小无关,但如果我删除它,它就会停止working@JoelFan:如果没有usebackq,“quote”表示命令而不是字符串(有关详细信息,请运行/?)另一种替代方法(更好地处理文件名中的空格)是使用:FOR/F“tokens=*”%%A in(“%file%”)DO…Hi@Anders当我在一个序列中有多个文件时,你能告诉我如何做同样的事情吗。就像我想设置如果我的文件小于2kb,那么将其移动到一个diff文件夹?。我的结果应该测试路径中的每个文件并进行验证。旁注:在测试之前,您应该检查文件是否存在。否则,文件大小将只是一个空字符串。。。我花了一段时间才注意到。没关系。。。它甚至不工作,写入一个变量为我现有的文件…这是不正确的。我创建了一个5 GB的文件,能够使用%%z1读取它的文件大小,它报告了5056590344。这是因为它仍然是一个字符串,没有转换成数字。尝试使用Set/a进行比较或算术运算,任何大于2 GB的操作都将失败。将NTFS转换为FAT32时,确定
for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )