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