Как проверить размер файла в пакете 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
Ответы
Ответ 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
Затем снова возвращается так много вещей.
Возможно, вы можете получить его оттуда, если вы его ищете.
Но я не уверен.