如何在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它。
但我不确定。