Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Двойное условие в IF

Ответить
Настройки темы
CMD/BAT - [решено] Двойное условие в IF

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:48, 11-05-2013

 

Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


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

Последний раз редактировалось Foreigner, 12-05-2013 в 00:33. Причина: для рекурсивного dir-a сортировка /os не подходит

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:16, 12-05-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Foreigner, вариант рабочий, но хотелось бы, чтобы в качестве результата выводилось именно имя файла и его размер.

Отправлено: 00:34, 12-05-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата kelevara:
но хотелось бы, чтобы в качестве результата выводилось именно имя файла и его размер. »
А он что делает?!

Отправлено: 01:57, 12-05-2013 | #4


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:37, 12-05-2013 | #5


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


kelevara,
Попробуйте еще раз, второй вариант. От 0:33.

Отправлено: 10:03, 12-05-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата kelevara:
А про его размер ничего не говорит, к сожалению. »
А каков его размер в реальности?

Имя и размер :
Код: Выделить весь код
@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

Последний раз редактировалось Iska, 12-05-2013 в 17:31. Причина: А, кстати — «/a:-d» ;).

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:10, 12-05-2013 | #7


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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 делается, как ни странно, намного быстрее.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 12-05-2013 в 19:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:15, 12-05-2013 | #8


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:27, 12-05-2013 | #9


Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ребята, всем огромное спасибо! Все варианты подходят, даже не знаю, что выбрать в итоге

Отправлено: 19:38, 12-05-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Двойное условие в IF

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - двойное раскрытие CyberMuesli Скриптовые языки администрирования Windows 23 29-12-2020 21:39
Загрузка - Двойное окно выбора ОС Divil Microsoft Windows 2000/XP 9 15-04-2013 17:54
двойное уменьшение частоты FSB K@kTuS Непонятные проблемы с Железом 2 20-04-2010 06:31
Двойное выполнение политики farlow Microsoft Windows NT/2000/2003 3 31-08-2007 15:00
Двойное копирование файла с FTP. :( BlackMonk Хочу все знать 3 13-02-2005 09:08




 
Переход