Подтвердить что ты не робот

Как проверить размер файла в пакете Windows script?

Я хочу иметь пакетный файл, который проверяет, что 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
4b9b3361

Ответ 1

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

Ответ 2

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

@Anders обошел эту проблему, используя 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 or equal %maxbytesize% bytes
)
goto :eof

:setsize
set size=%~z1
goto :eof

Мне было любопытно по поводу беспокойства Дж. Буври относительно 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

Ответ 3

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

Ответ 4

Я предпочитаю использовать функцию DOS. Чувствую меня чище.

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

Ответ 5

Если ваш %file% является входным параметром, вы можете использовать %~zN, где N - номер параметра.

например. a test.bat, содержащий

@echo %~z1

Будет отображаться размер первого параметра, поэтому, если вы используете "test myFile.txt", он отобразит размер соответствующего файла.

Ответ 6

Как обычно, 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 (в пакетном режиме), чтобы получить результат возврата.

Ответ 7

Другой пример

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

Ответ 8

Создайте пакетный файл с одной строкой 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 set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
call %temp%\GetFileSize  myfile.txt
if (%GetFileSize) GTR 1000  goto Too_Much_Data
rem etc

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

Ответ 9

Просто увидел этот старый вопрос, чтобы посмотреть, есть ли в 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

Ответ 10

Это было мое решение для оценки размеров файлов без использования 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  
    )
)  

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

Просто идея:

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

>dir thing

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

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

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