Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
#1

Применить сжатие файлов по расширению - CMD/BAT

06.09.2015, 17:28. Просмотров 888. Ответов 27
Метки нет (Все метки)

Приветстую

К примеру есть кусок скрипта

Windows Batch file
1
for %%A in (D:\TMP) do (if exist "%%~A" (for %%A in ("%%~A\*.png") do (compact /c "%%~A")))

Знаю, что можно намного проще, но я пытаюсь сделать так, чтобы обрабатывало *.png и *.jpg + иметь на будущее универсальный шаблон для обработки файлов по нескольким расширеням.


for %%A in ("%%~A\*.png %%~A\*.png") и прочие вариации не работают.
Пытался найти ответ тут http://www.cyberforum.ru/cmd-bat/thread877664.html
Или не нашел, или не понял

Как применить сжатие к *.png и *.jpg одновременно ?

Заранее спасибо

Добавлено через 19 минут
Собственно, главный вопрос снят.

Вариант
Windows Batch file
for %%A in (D:\TMP) do (if exist "%%~A" (for %%A in ("%%~A\*.png" "%%~A\*.jpg") do (compact /c "%%~A")))
Работает (видимо упустил)

Как можно упросить ?
Где и чего я лишнего нагородил ? )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2015, 17:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Применить сжатие файлов по расширению (CMD/BAT):

Распределение файлов по их расширению
Всем привет!) Спасайте!! Нужно создать батник который распределяет разные файлы...

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

Перемещение файлов по расширению
Доброго времени суток. Очень нужна Ваша помощь. Требуется создать bat-ник,...

Сортировка имен файлов по расширению
Здравствуйте! Помогите, не могу решить задачку: Создать командный файл...

Мониторинг файлов по дате создания и расширению
Здравствуйте, есть задача мониторить папку на предмет наличия файлов с...

Запрет записи файлов в папку, по расширению
Добрый день. Прошу подсказать скрипт или bat выполняющий : запрет записи...

27
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 17:35 #2
Цитата Сообщение от vavun Посмотреть сообщение
Где и чего я лишнего нагородил ? )
Уберите проверку директорий.
Цитата Сообщение от vavun Посмотреть сообщение
if exist "%%~A"
0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 17:37 #3
..."одновременно" или все-таки последовательно?
Windows Batch file
1
2
3
4
5
@echo off
set currentDir=d:\tmp
cd /d  %currentDir%
for %%i in (*.jpg *.png)  do echo %currentDir%\%%i
pause
Заменить echo на compact /c.
0
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
06.09.2015, 17:39  [ТС] #4
Цитата Сообщение от sov44 Посмотреть сообщение
Уберите проверку директорий.
А если обрабатывать несколько директорий и их существование не гарантируется ?

Добавлено через 1 минуту
Цитата Сообщение от Garry Galler Посмотреть сообщение
одновременно" или все-таки последовательно?
Имелось ввиду и к *.jpg и к *.png
0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 17:40 #5
Для рекурсии ключ /r для for понадобится.
0
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 17:41 #6
Цитата Сообщение от vavun Посмотреть сообщение
А если обрабатывать несколько директорий и их существование не гарантируется ?
да.
0
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
06.09.2015, 17:45  [ТС] #7
Цитата Сообщение от Garry Galler Посмотреть сообщение
Для рекурсии ключ /r для for понадобится.
Рекурсия не требуется.

Цитата Сообщение от sov44 Посмотреть сообщение
да.
так ?
Windows Batch file
for %%A in (D:\TMP D:\TMP1 D:\TMP2) do (for %%A in ("%%~A\*.png" "%%~A\*.jpg") do (compact /c "%%~A"))
?

Добавлено через 2 минуты
Проверил, работает.
0
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 17:46 #8
vavun, попробуйте пока классически
Windows Batch file
1
2
3
4
5
6
7
echo off
set folder="путь к папке"
for %%a in (png,jpg) do (
for /f "delims=" %%b in ('dir /b /s /a-d "%folder%\*.%%a" 2^>nul') do (
echo %%b
))
pause
1
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
06.09.2015, 18:01  [ТС] #9
sov44, странное поведение dir.

Без ключа /s отображаются только имена файлов в выбранной директории

С ключом /s имена с путями + имена с путями вложенных директорий, как и должно быть

Добавлено через 6 минут
Мне бы, как раз, избавиться от рекурсии.

Добавлено через 2 минуты
Господа, если я все это делаю не тем местом, то так и скажите
И заодно подскажите, как надо )
0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 18:19 #10
vavun,
Посмотрите как работает такой вариант - может это подойдет:
В список можно добавлять любое число (в пределах возможностей cmd) путей папок (в том числе и папки с пробелами - в кавычках)
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
set "dirs=d:\tmp,"d:\tmp 1",d:\tmp2"
for %%d in (%dirs%) do (
 if exist %%~d (
  cd /d %%~d
  for %%i in (*.jpg *.png)  do echo "%%~d\%%i"
  )
 )
pause
Никакой рекурсии - файлы ищутся только в указанных папках - если те существуют.
1
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 18:20 #11
vavun, какова глубина поиска? Если просто в одной папке, то примерно так
Windows Batch file
1
2
3
4
5
6
7
echo off
set folder="путь к папке"
for %%a in (png,jpg) do (
for /f "delims=" %%b in ('dir /b "%folder%\*.%%a" 2^>nul') do (
echo %%b
))
pause
1
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
06.09.2015, 18:36  [ТС] #12
В общем то варианты из 7-го 10-го и 11-го сообщения работают )

Добавлено через 8 минут
Перефразирую вопрос: почему мой вариант является говнокодом ? )
0
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 19:26 #13
vavun, слишком много переменных "А", возможно код заблудился.
0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 19:37 #14
...Собственно, мой вариант чуток можно сократить (команда cd сама в состоянии проверить есть ли каталог)
Windows Batch file
1
2
3
4
set "dirs=d:\tmp,"d:\tmp 1",d:\tmp2, d:\tmp3"
for %%d in (%dirs%) do (
  cd /d %%~d 2>nul && for %%i in (*.jpg *.png)  do echo "%%~d\%%i"
)

Не по теме:

Что касается последнего вопроса - то это философский вопрос.
На winbatch вообще тяжело писать что-то удобочитаемое и эффективное одновременно.
Поэтому и ваш вариант вполне себе вариант.
... Вот придет, к примеру, ComSpec - так если захочет - вообще упакует всю логику в одну команду.
И наши коды на фоне его будут уже этим самым г-кодом :).

1
vavun
9901 / 5189 / 788
Регистрация: 07.04.2013
Сообщений: 15,139
06.09.2015, 19:59  [ТС] #15
Цитата Сообщение от Garry Galler Посмотреть сообщение
мой вариант чуток можно сократить
перефразирую ...
Windows Batch file
1
2
3
4
5
call :SORTFILES "d:\tmp" "*.jpg *.png"
pause
:SORTFILES
for %%d in (%1) do (cd /d %%~d 2>nul && for %%i in (%~2)  do echo "%%~d\%%i")
exit /b
0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 20:09 #16
vavun,
Почему нет... только в данном случае со списком папок уже не работает. Чего-то там переделывать нужно для этого.

Добавлено через 3 минуты
А понял, если %1 заменить на %~1 - тогда все как и прежде будет. Не совсем.
1
vavun
06.09.2015, 20:12  [ТС]
  #17

Не по теме:

Цитата Сообщение от Garry Galler Посмотреть сообщение
Не совсем.
Вот и я о том же :D

0
Garry Galler
1264 / 1007 / 373
Регистрация: 28.10.2013
Сообщений: 2,565
06.09.2015, 20:21 #18
Для списка с путями без пробелов вроде все как и прежде, а если путь с пробелом - тогда повторный (в случае совпадения первой части имени папки с другой) поиск идет. А кавычки (как в первом варианте) уже не работают.

Добавлено через 3 минуты
Если так сделать "%~1", тогда все как в первом варианте работает
Опять повтор. Не то.
0
sov44
1758 / 742 / 127
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 21:04 #19
поиск расширений во втором уровне
Windows Batch file
1
2
3
4
5
6
7
@echo off
call :SORTFILES "d:\tmp" "*.jpg *.png"
pause
exit /b
:SORTFILES
for /d %%d in ("%~1\*") do (cd /d "%%d" && for %%i in (%~2)  do echo "%%d\%%i")
goto :eof

Не по теме:

vavun, не понял, как надо. Может так?



Добавлено через 5 минут
в первом уровне
Windows Batch file
1
2
3
4
5
6
7
@echo off
call :SORTFILES "d:\tmp" "*.jpg *.png"
pause
exit /b
:SORTFILES
cd /d "%~1" && for %%i in (%~2)  do echo "%~1\%%i"
goto :eof
0
alpap
1364 / 1095 / 348
Регистрация: 26.04.2015
Сообщений: 3,916
06.09.2015, 21:46 #20
vavun, Наилучший вариант - 11 сообщение от sov44, возьмет любое имя папки, а выход уже сами думайте, с путями echo %%b или имена с расширением echo %%~nxb.
1
06.09.2015, 21:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2015, 21:46
Привет! Вот еще темы с решениями:

Перенос файлов по расширению (более 500), сохраняя структуру каталогов
Добрый день. Скрипт должен перемещать файлы по расширению (больше 500)...

Выборка файлов по расширению, упаковка, отправка адресатам, ведение лога, резервное копирование
Всем привет Сделал следующий батник Он ищет в папке файлы aaa0000bbb*.CNG,...

Создание каталога по расширению
Как в cmd создать каталог по расширению? Т.е. Если у меня НАПРИМЕР 3 типа:...

Выбрать файлы по размеру и расширению
Здравствуйте помогите пожалуйста с заданием! Нужно выбрать файлы с расширением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru