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

我想有一个batch file来检查文件的filesize

如果它大于%somany% kbytes,它应该用GOTOredirect到别的地方。

例:

 [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 

如果文件名用作batch file的参数, %~z1需要%~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 ) 

%~z1扩展为batch file的第一个参数的大小。 看到

 C:\> call /? 

 C:\> if /? 

简单的例子:

 @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 

我喜欢@Anders的答案,因为%〜z1秘密酱的解释。 但是,正如指出的那样,只有当文件名作为第一个parameter passing给batch file时才起作用。

@Anders通过使用FOR来解决这个问题,这对于这个问题来说是一个很好的解决方法,但是这样做有点难。

相反,我们可以使用CALL回到%〜z1的简单回答。 如果你有一个文件名保存在一个环境variables中,如果你将它用作batch file中的一个例程的参数,它将变成%1:

 @echo off setlocal set file=test.cmd set maxbytesize=1000 call :setsize %file% if %size% lss %maxbytesize% ( echo File is less than %maxbytesize% bytes ) else ( echo File is greater than %maxbytesize% bytes ) goto :eof :setsize set size=%~z1 goto :eof 

如果%file%是input参数,则可以使用%~zN ,其中N是参数的编号。

例如包含一个test.bat

 @echo %~z1 

将显示第一个参数的大小,所以如果使用“ test myFile.txt ”,它将显示相应文件的大小。

我更喜欢使用DOSfunction。 对我感觉更干净。

 SET SIZELIMIT=1000 CALL :FileSize %1 FileSize IF %FileSize% GTR %SIZELIMIT% Echo Large file GOTO :EOF :FileSize SET %~2=%~z1 GOTO :EOF 

像往常一样,VBScript可供您使用…..

 Set objFS = CreateObject("Scripting.FileSystemObject") Set wshArgs = WScript.Arguments strFile = wshArgs(0) WScript.Echo objFS.GetFile(strFile).Size & " bytes" 

另存为filesize.vbs并在命令行中input:

 C:\test>cscript /nologo filesize.vbs file.txt 79 bytes 

使用for循环(批量)获取返回结果。

另一个例子

  FOR %I in (file1.txt) do @ECHO %~zI 

创build一个包含一行的batch fileGetFileSize.bat

 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. 

您甚至可以即时创build您的testing文件以消除烦人的必需文件,请注意echo语句中的双重百分比:

 echo set GetFileSize=%%~z1 > %temp%\GetFileSize.bat call %temp%\GetFileSize myfile.txt if (%GetFileSize) GTR 1000 goto Too_Much_Data rem etc 

后面的解决scheme是反意大利面。 太赞了。 但是,更多的磁盘写入。 检查使用次数。

只是看到这个老问题,看看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 

这是我的解决scheme,用于评估文件大小,而不使用VB / Perl /等。 并坚持使用本机的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 ) ) 

不是最干净的解决scheme,但它完成了工作。

经过几次“尝试和testing”迭代后,我find了一种方法(仍然不存在)来获取循环variables中的文件大小(不是命令行参数):

 for %%i in (*.txt) do ( echo %%~z%i ) 

需要注意的是批次的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的最大文件大小!

只是一个想法:

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

 >dir thing 

然后它又回来了很多东西。

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

但我不确定。