Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
vavun
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
1

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

06.09.2015, 17:28. Просмотров 943. Ответов 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") и прочие вариации не работают.
Пытался найти ответ тут Циклические операции и примеры (команда FOR) * [Статья]
Или не нашел, или не понял

Как применить сжатие к *.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
Ответы с готовыми решениями:

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

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

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

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

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

27
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 17:35 2
Цитата Сообщение от vavun Посмотреть сообщение
Где и чего я лишнего нагородил ? )
Уберите проверку директорий.
Цитата Сообщение от vavun Посмотреть сообщение
if exist "%%~A"
0
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
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
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
06.09.2015, 17:39  [ТС] 4
Цитата Сообщение от sov44 Посмотреть сообщение
Уберите проверку директорий.
А если обрабатывать несколько директорий и их существование не гарантируется ?

Добавлено через 1 минуту
Цитата Сообщение от Garry Galler Посмотреть сообщение
одновременно" или все-таки последовательно?
Имелось ввиду и к *.jpg и к *.png
0
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
06.09.2015, 17:40 5
Для рекурсии ключ /r для for понадобится.
0
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 17:41 6
Цитата Сообщение от vavun Посмотреть сообщение
А если обрабатывать несколько директорий и их существование не гарантируется ?
да.
0
vavun
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
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 / 128
Регистрация: 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
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
06.09.2015, 18:01  [ТС] 9
sov44, странное поведение dir.

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

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

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

Добавлено через 2 минуты
Господа, если я все это делаю не тем местом, то так и скажите
И заодно подскажите, как надо )
0
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
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 / 128
Регистрация: 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
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
06.09.2015, 18:36  [ТС] 12
В общем то варианты из 7-го 10-го и 11-го сообщения работают )

Добавлено через 8 минут
Перефразирую вопрос: почему мой вариант является говнокодом ? )
0
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
06.09.2015, 19:26 13
vavun, слишком много переменных "А", возможно код заблудился.
0
Garry Galler
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
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
9806 / 5186 / 790
Регистрация: 07.04.2013
Сообщений: 15,143
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
1436 / 1158 / 426
Регистрация: 28.10.2013
Сообщений: 2,937
06.09.2015, 20:09 16
vavun,
Почему нет... только в данном случае со списком папок уже не работает. Чего-то там переделывать нужно для этого.

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

Не по теме:

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

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

Добавлено через 3 минуты
Если так сделать "%~1", тогда все как в первом варианте работает
Опять повтор. Не то.
0
sov44
1758 / 742 / 128
Регистрация: 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
1457 / 1173 / 382
Регистрация: 26.04.2015
Сообщений: 4,134
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

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

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

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


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

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

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