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

问题描述:

我想要一个批处理文件来检查filesize是什么文件。如何检查Windows批处理脚本中文件的大小?

如果它大于%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 

如果文件名作为参数传递给批处理文件,你需要的是%~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 
) 
+5

你能解释“usebackq”选项如何提供帮助?它似乎没有任何与文件大小有关,但如果我删除它,它停止工作 – JoelFan 2010-06-03 15:27:35

+8

@JoelFan:没有usebackq,'引号意味着命令,而不是字符串(运行FOR /?的细节)另一种替代方案(为了更好地处理文件名中的空格)是使用:FOR/F“tokens = *”%% A IN(“%file%”)DO ... – Anders 2010-06-03 17:33:19

+0

嗨@Anders你能让我知道我该怎么做同样的当我有一个序列中的多个文件。就像我想设置,如果我的文件小于2kb,然后将其移动到一个diff文件夹?我的结果应该测试路径中的每个文件并进行验证。 – 2015-12-30 08:30:10

只是一个想法:

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

>dir thing 

然后再返回这么多东西。

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

但我不确定。

像往常一样,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是参数的编号。

E.g.一个test.bat

@echo %~z1 

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

%~z1展开为批处理文件的第一个参数的大小。见

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 
+0

思南Ünür解决方案Windows Server 2008上不工作.. – 2011-10-04 12:50:07

刚才看到这个老问题,看看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 /等。并坚持使用本地Windows命令:

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=%~z1 

一个行批处理文件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 

这后一种解决方案是antispaghetti。太赞了。但是,更多的磁盘写入。检查使用次数。

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

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

@Anders通过使用FOR解决了这个问题,这是一个很好的1-liner修复问题,但是,它有点难以阅读。

取而代之的是,我们可以使用CALL回到更简单的答案%z1。 如果您有存储在一个环境变量的文件名会成为 %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 

几个后“尝试和测试”的迭代我已经找到一种方法(还没有出现在这里)来获取文件的大小,循环变量(不是一个命令行参数):

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