我希望有它检查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
有帮助吗?

解决方案

如果该文件名被用作一个参数到批处理文件,你需要的是%~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
)

其他提示

我喜欢@Anders答案,因为在%〜Z1的秘密武器的说明。 然而,正如指出的那样,只有当文件名作为传递工作 第一个参数到批处理文件。

@Anders解决此工作通过使用FOR,这是一个很大的1-衬垫固定到 的问题,但是,它有点难以阅读。

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

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

我更喜欢使用一个DOS函数。感觉清洁剂箱。

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

如果您的%file%是一个输入参数,可以使用%~zN,其中N是参数的数目。

E.g。含有test.bat

@echo %~z1

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

和往常一样,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环路(在批处理)来获得返回结果。

又如

  FOR %I in (file1.txt) do @ECHO %~zI

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

这后一种解决方案是antispaghetti。太赞了。然而,更多的磁盘写操作。检查使用计数。

刚看到这个老问题想看看是否有的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 /等溶液。和使用本机窗口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  
    )
)  

不是干净的解决方案,但它能够完成任务。

需要注意的是批次的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!)

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

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

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

只是一个想法:

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

>dir thing

然后再次返回这么多的东西。

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

但我不知道。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top