Как я могу проверить размер файла в пакетном сценариев 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
710   13  

13 ответов:

Если имя файла используется в качестве параметра для пакетного файла, все что вам нужно-это %~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
)

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

мне нравится ответ @Anders, потому что объяснение секретного соуса %~z1. Однако, как уже отмечалось, это работает только тогда, когда имя файла передается как первый параметр для пакетного файла.

@Андерс работал вокруг этого с помощью FOR, который является отличным 1-лайнер исправить проблема, но, это несколько сложнее читать.

вместо этого мы можем вернуться к более простому ответу с %~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 %maxbytesize% bytes
)
goto :eof

:setsize
set size=%~z1
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 - номер параметра.

например, a 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.летучая мышь, содержащая

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

Это последнее решение является антиспагетти. Так мило. Тем не менее, больше записи на диск. Проверьте количество использований.

просто увидел этот старый вопрос, глядя, чтобы увидеть, если окна было что-то встроено. Дело ~z-это то, о чем я не знал, но не применимо для меня. Я закончил с Perl one-liner:

@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 / etc. и придерживаясь собственных команд оболочки 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  
    )
)  

Не самое чистое решение, но оно выполняет свою работу.

после нескольких итераций "try and test" я нашел способ (все еще не присутствующий здесь) получить размер файла в переменной цикла (не параметр командной строки):

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

важно отметить, что ограничение 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, нарушит сценарий! Поскольку размер файла измеряется в байтах, скрипты будут поддерживать максимальный размер файла около 255.9999997615814 МБ !

просто мысль:

вы можете получить размер файла, выполнив команду "dir":

>dir thing

затем снова возвращает так много вещей.

может быть, вы можете получить его оттуда, если вы ищете его.

но я не уверен.

Comments

    Ничего не найдено.