71

我想要一个批处理文件来检查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
4

14 回答 14

105

如果文件名用作批处理文件的参数,您只需要%~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
)
于 2009-07-29T12:15:34.287 回答
23

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

@Anders 通过 usingFOR解决了这个问题,这是解决问题的一个很好的 1-liner 解决方案,但是,它有点难以阅读。

相反,我们可以使用 %~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

我一直对 J. Bouvrie 对 32 位限制的担忧感到好奇。看来他正在谈论LSS在文件大小逻辑本身上使用 not 的问题。为了解决 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
于 2015-04-24T11:43:29.563 回答
11

%~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
于 2009-07-29T12:08:14.353 回答
11

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

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF
于 2014-06-04T18:42:32.627 回答
8

如果您%file%是输入参数,则可以使用%~zN,其中N是参数的编号。

例如一个test.bat包含

@echo %~z1

会显示第一个参数的大小,所以如果使用“ test myFile.txt”会显示对应文件的大小。

于 2009-07-29T12:07:38.970 回答
6

另一个例子

  FOR %I in (file1.txt) do @ECHO %~zI
于 2014-05-20T06:02:38.693 回答
4

像往常一样,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循环(批量)获取返回结果。

于 2009-07-29T12:06:32.827 回答
2

这是我在不使用 VB/perl/etc 的情况下评估文件大小的解决方案。并坚持使用本机 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  
    )
)  

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

于 2013-07-25T16:42:44.163 回答
2

创建一个包含一行的批处理文件 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

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

于 2014-07-24T03:49:18.463 回答
2

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

for %%i in (*.txt) do (
    echo %%~z%i
)
于 2016-10-13T10:45:41.527 回答
1

刚刚看到这个老问题,想看看 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
于 2013-07-14T20:06:30.730 回答
0

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

于 2015-01-26T15:07:15.333 回答
0

你需要两件事。

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 )

我找到了这个线程,这几乎是我所需要的,我尝试了很多不同的东西 - 这有点令人沮丧,因为 robocopy 看起来有 /min:1 但因为我想重命名传输中的文件而让我感到很沮丧必须使用@#$!!批处理脚本。

于 2020-08-04T04:28:52.807 回答
-5

只是一个想法:

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

>dir thing

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

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

但我不确定。

于 2009-07-29T11:54:59.797 回答