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

Den*_*man 59 batch-file filesize

我想要一个批处理文件来检查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
Run Code Online (Sandbox Code Playgroud)

And*_*ers 97

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

  • @JoelFan:没有usebackq,'quote表示命令而不是字符串(运行FOR /?以获取详细信息)另一种选择(更好地处理文件名中的空格)是使用:FOR/F"tokens =*"%% A IN ("%file%")DO ... (12认同)
  • 你能解释一下"usebackq"选项有用吗?它似乎与文件大小无关,但如果我删除它,它就会停止工作 (6认同)

Ste*_*uan 14

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

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

相反,我们可以通过使用返回到%~z1的更简单的答案CALL.如果您有一个存储在环境变量中的文件名,如果您将其用作批处理文件中例程的参数,它将变为%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
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 11

%~z1扩展为批处理文件的第一个参数的大小.看到

C:\> call /?
Run Code Online (Sandbox Code Playgroud)

C:\> if /?
Run Code Online (Sandbox Code Playgroud)

简单的例子:

@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
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF
Run Code Online (Sandbox Code Playgroud)

  • 除了关于不是 DOS 的 nit。这是最干净的解决方案。使用 call :label 获取可以使用的编号参数。 (2认同)

Her*_*oni 8

如果您%file%是输入参数,则可以使用%~zN,N参数编号在哪里.

例如test.bat含有

@echo %~z1
Run Code Online (Sandbox Code Playgroud)

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


小智 5

另一个例子

  FOR %I in (file1.txt) do @ECHO %~zI
Run Code Online (Sandbox Code Playgroud)