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

我想有一个批处理文件,检查什么是 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
247068 次浏览

只是一个想法:

您可以通过运行命令“ 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是参数的编号。

例如:

@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

如果使用文件名作为批处理文件的参数,那么您所需要的就是 %~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
)

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

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

任何大于最大 INT32值的数字都会破坏脚本!由于文件大小是以字节为单位衡量的,因此脚本将支持大约255.999997615814 MB 的最大文件大小!

我喜欢@Anders 的回答,因为% ~ z1秘方的解释。 但是,如前所述,只有当文件名作为 批处理文件的第一个参数。

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

相反,我们可以使用 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 or equal %maxbytesize% bytes
)
goto :eof


:setsize
set size=%~z1
goto :eof

我对 J Bouvrie 关于32位限制的担忧很好奇。他似乎是在谈论一个问题,即在文件大小逻辑本身上没有使用 LSS。为了解决 J。 Bouvrie 的问题,我重写了解决方案,使用了一个带填充的字符串比较:

@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

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

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

你需要两样东西。

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 )

我找到了这个线程,它是 差不多,我需要什么,我尝试了一大堆不同的东西-这是轻微的沮丧,因为机器人复制看起来有/min: 1,但得到所有堵塞,因为我想重命名文件在传输中,使我不得不使用@# $!批处理脚本。