PDA

Показать полную графическую версию : [решено] Двойное условие в IF


kelevara
11-05-2013, 23:48
Доброго дня!
Мне необходимо найти файл с максимальным размером определенного расширения среди всех файлов в каталоге и его подкаталогах. Ранее с похожей задачей мне тут помогли и тот скрипт я взял за основу. Сам алгоритм предельно ясен, но вот как в подпрограмме объединить две проверки в IF в одну - меня начинает клинить. Вот что я "родил":

@ECHO Off
::задается целевая директория
SET MyDir=C:\lab1\wingraf
::задается расширение файлов, размер которых будет учитываться
SET Ras=.gif
::вызывается подпрограмма _subdir
SET /a max = 0
Call :_subdir %MyDir% %Ras%
::вывод на экран сообщений
ECHO Max size of %Ras%-file = %Size%
ECHO Name this file - %Name%
Pause>Nul
Exit
:_subdir
::перебераем файлы в целевой директории и ее подкаталогах и если их расширение соответстует заданному, то проверяем на максимальный размер
FOR /R %1 %%s IN (*) DO IF %%~xs==%2 (if %%~zn GEQ %max% (SET %Size% = %%~zn SET %Name% = %%~ns)
EXIT /B

Foreigner
12-05-2013, 00:16
kelevara,
можно просто dir-ом:

@echo off
setlocal enabledelayedexpansion

set size=0

for /f "delims=" %%i in (' dir /b /s "c:\lab1\wingraf\*.gif" ') do (

if %%~zi geq !size! set "file=%%~fi" && set size=%%~zi

)

echo %size% "%file%"

kelevara
12-05-2013, 00:34
Foreigner, вариант рабочий, но хотелось бы, чтобы в качестве результата выводилось именно имя файла и его размер.

Iska
12-05-2013, 01:57
но хотелось бы, чтобы в качестве результата выводилось именно имя файла и его размер. »
А он что делает?!

kelevara
12-05-2013, 09:37
Iska, указанная программа выводит на экран полный путь к самому большому файлу указанного расширения. А про его размер ничего не говорит, к сожалению.

Foreigner
12-05-2013, 10:03
kelevara,
Попробуйте еще раз, второй вариант. От 0:33.

Iska
12-05-2013, 16:10
А про его размер ничего не говорит, к сожалению. »
А каков его размер в реальности?

Имя и размер ;):
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq tokens=3,4" %%i in (
`dir /s /a:-d /-c ".\*.*" ^| findstr.exe /v /r /c:"^$" /c:"^ .*$" ^| sort.exe /r /+18`
) do echo %%i %%j & goto :Out

:Out

endlocal
exit /b 0

megaloman
12-05-2013, 17:15
@Echo off
cls

Set Where=E:\Audio
Set Ext=mp3

Set /A S=-1

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /B /S /A:D 2^>nul`) DO Call :ForSize "%%d\*.%Ext%"
Echo %S% %Name%
GoTo :Eof

:ForSize
FOR /F "usebackq delims=" %%f IN (`Dir %1 /B /S /A:-D /O:-S 2^>nul`) DO (
If %S% LSS %%~zf Set S=%%~zf&Set Name=%%f
GoTo :Eof
)
Вот короче код, аналогичный тому, что у Foreigner, не знаю, что сделается быстрее@Echo off
cls
SetLocal EnableExtensions EnableDelayedExpansion

Set Where=E:\Audio
Set Ext=mp3

Set /A S=-1

FOR /F "usebackq delims=" %%f IN (`Dir "%Where%\*.%Ext%" /B /S /A:-D 2^>nul`) DO (
If !S! LSS %%~zf Set S=%%~zf&Set Name=%%f
)
Echo %S% %Name%
Похоже, мой первый код делается всё-таки быстрее, но код от Iska делается, как ни странно, намного быстрее.

Georgio
12-05-2013, 17:27
kelevara! "Верным путём идёте, товарищ!" Просто у Вас несколько неточностей. Вот так работает:

@ECHO OFF
::задается целевая директория
SET MyDir=C:\lab1\wingraf
::задается расширение файлов, размер которых будет учитываться
SET Ras=.gif
::вызывается подпрограмма _subdir
SET Size=0
CALL :_subdir %MyDir% %Ras%
::вывод на экран сообщений
ECHO Max size of %Ras% file = %Size%
ECHO Name of this file - %Name%
PAUSE>nul
EXIT
:_subdir
::перебираем файлы в целевой директории и ее подкаталогах и, если их расширение соответствует заданному, проверяем на максимальный размер
FOR /R %1 %%s IN (*) DO IF %%~xs==%2 IF %%~zs GEQ %Size% SET Size=%%~zs&&SET Name=%%~ns
EXIT /B

kelevara
12-05-2013, 19:38
Ребята, всем огромное спасибо! Все варианты подходят, даже не знаю, что выбрать в итоге :)

Iska
12-05-2013, 20:08
даже не знаю, что выбрать в итоге »
kelevara, выбирайте всё: «оба лучше».




© OSzone.net 2001-2012