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

问题描述 投票:56回答:13

我想要一个批处理文件来检查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
batch-file filesize
13个回答
96
投票

如果文件名用作批处理文件的参数,则只需要%~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
)

1
投票

这是我在不使用VB / perl / etc的情况下评估文件大小的解决方案。并坚持使用本机Windows shell命令:

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!)

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


0
投票

需要注意的重要事项是批处理的INT32限制:'无效数字。数字限制在32位精度。

请尝试以下语句:

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

任何大于最大INT32值的数字都会打破脚本!看到文件大小以字节为单位,脚本将支持大约255.9999997615814 MB的最大文件大小!


0
投票

经过一些“尝试和测试”迭代后,我找到了一种方法(这里仍然不存在)来获取循环变量(不是命令行参数)中的文件大小:

>dir thing

-4
投票

只是一个想法:

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

qazxswpoi

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

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

但我不确定。


13
投票

我喜欢@Anders的答案,因为%~z1秘密酱的解释。但是,正如所指出的那样,仅当文件名作为第一个参数传递给批处理文件时才有效。

@Anders通过使用FOR来解决这个问题,CALL对于这个问题是一个很好的一线解决方案,但是,它有点难以阅读。

相反,我们可以通过使用@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 or equal %maxbytesize% bytes ) goto :eof :setsize set size=%~z1 goto :eof 回到%~z1更简单的答案。如果您有一个存储在环境变量中的文件名,如果您将其用作批处理文件中例程的参数,它将变为%1:

LSS

我一直很好奇J. Bouvrie关于32位限制的担忧。他似乎在谈论使用@echo on setlocal set file=test.cmd set maxbytesize=1000 call :setsize %file% set checksize=00000000000000000000%size% set checkmaxbytesize=00000000000000000000%maxbytesize% if "%checksize:~-20%" lss "%checkmaxbytesize:~-20%" ( echo File is less than %maxbytesize% bytes ) else ( echo File is greater than or equal %maxbytesize% bytes ) goto :eof :setsize set size=%~z1 goto :eof 而不是文件大小逻辑本身的问题。为了解决J. Bouvrie的担忧,我改写了使用填充字符串比较的解决方案:

%~z1

11
投票

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

简单的例子:

SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

9
投票

我更喜欢使用DOS功能。感觉更干净。

%file%

8
投票

如果你的%~zN是输入参数,你可以使用N,其中test.bat是参数的编号。

例如。包含@echo %~z1

test myFile.txt

将显示第一个参数的大小,因此如果使用“Set objFS = CreateObject("Scripting.FileSystemObject") Set wshArgs = WScript.Arguments strFile = wshArgs(0) WScript.Echo objFS.GetFile(strFile).Size & " bytes" ”,它将显示相应文件的大小。


4
投票

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

filesize.vbs

保存为C:\test>cscript /nologo filesize.vbs file.txt 79 bytes 并在命令行中输入:

for

使用 FOR %I in (file1.txt) do @ECHO %~zI 循环(批量)获取返回结果。


4
投票

另一个例子

GetFileSize=%~z1

2
投票

创建包含的一行批处理文件GetFileSize.bat

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 set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
call %temp%\GetFileSize  myfile.txt
if (%GetFileSize) GTR 1000  goto Too_Much_Data
rem etc

您甚至可以动态创建测试文件以消除讨厌的必需文件,请注意echo语句中的双倍百分比:

@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

后一种解决方案是反意大利。很好。但是,更多的磁盘写入。检查使用次数。


1
投票

刚刚看到这个老问题,看看Windows是否有内置的东西。这个东西是我不知道的东西,但不适合我。我最终得到了一个Perl单线程:

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  
    )
)  
© www.soinside.com 2019 - 2024. All rights reserved.