Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
1

Разархивация и архивация файлов, осуществляемые с определёнными параметрами

29.08.2015, 02:52. Просмотров 4932. Ответов 44
Метки нет (Все метки)

Помогите пожалуйста с созданием двух BAT-файлов. По форуму искал. К сожалению ничего подходящего не нашел.

Есть дерево папок с файлами. Файлов несколько десятков тысяч.
В основном архивы zip, но встречаются и незаархивированные с разными расширениями. Очень редко архивы rar.
В каждом архиве только один файл.
Имена папок русские с пробелами. Имена файлов в основном также русские с пробелами. Часто достаточно длинные (как названия папок, так и файлов)

1. Нужен бат-файл, который разархивирует все файлы, начиная с указанной директории, с сохранением структуры поддиректорий, с удалением архивов, пропуская неархивированные.

2. Второй бат-файл, который заархивирует файлы с указанными расширениями в архивы zip (один архив = один файл) с удалением оригинальных файлов, конечно с сохранением всей структуры дерева папок.

Бат файлы желательно должны быть перемещаемыми.
Т.е. копируются рядом с нужным каталогом набирается что то типа

rununzip.bat "Основы китайского языка. Задоенко"
Все архивы (zip, rar) в папке и подпапках /"Основы китайского языка. Задоенко" будут разархивированы в те же подпапки, а сами архивы удалены.

runzip.bat "Основы китайского языка. Задоенко"
Файлы с указанными внутри батника расширениями (например txt и bmp) в папке и подпапках /"Основы китайского языка. Задоенко" будут заархивированы с максимальным сжатием в архивы zip с теми же именами, а оригиналы удалены.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2015, 02:52
Ответы с готовыми решениями:

Создание bat файла с определёнными параметрами
Помогите создать батник. Помогите пожалуйста Указания к работе: во всех заданиях необходимо...

Написать батник, который будет запускать Avast с определёнными параметрами и ключами
Добрый день! Идея состоит в том, чтобы написать батник, который будет заходить в папку с...

Очистка рабочего стола от всех файлов, кроме файлов с определёнными расширениями
Добрый день. Помогите написать скрипт для очистки определенных папок (Рабочий стол, Мои документы)...

Копирование файлов с определёнными условиями
Здравствуйте! Подскажите пожалуйста как выполнить это в командной строке: Скопировать в каталоги:...

Подсчёт и удаление файлов с определёнными расширениями
Здрасте) Помоги пожалуйста с заданием. Вообще с батниками как то не приходилось работать, а тут...

44
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 12:18  [ТС] 21
Сейчас поэкспериментирую. Пока попробовал по методу sov44 Что то я не так делаю, видимо... Все из папок просто удалилось.

И все-же править батник, это неправильно. Нужно запускать с аргументом.
Сейчас создам и попробую. Отпишусь через 5 минут.
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
31.08.2015, 12:20 22
Цитата Сообщение от Nik782 Посмотреть сообщение
Я не понял, Ваш батник работает с папкой c:\1\книги ? Туда все копировать?
пропишите свой путь к тестовой папке
Цитата Сообщение от Nik782 Посмотреть сообщение
Он запаковывает или распаковывает?
и запаковывает и распаковывает
0
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 13:09  [ТС] 23
Давайте пока без папок. А то я путаюсь ))
Первое отладить бы процесс запаковки распаковки. Уже плюс.

Добавлено через 49 секунд
Цитата Сообщение от sov44 Посмотреть сообщение
и запаковывает и распаковывает
Как это? Одновременно? Или где то переключатель?

Добавлено через 57 секунд
Цитата Сообщение от sov44 Посмотреть сообщение
пропишите свой путь к тестовой папке
ну это понятно, но в Вашем варианте с папкой "c:\1\книги" ?
Мне проще пока папку создать, чем прописывать )))

Добавлено через 4 минуты
Цитата Сообщение от alpap Посмотреть сообщение
И обязательно сохранить в кодировке 866.
подождите... подождите...
Что то у меня с этим оказывается проблема...
Минутку...

Добавлено через 21 минуту
Так. Пока не получается.
Давайте сделаем пока без выбора папок.
Пусть папка задается жестко в батнике.

Что нужно исправить?

Распаковка
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo Введите имя папки
set /p a=
cd /d "c:\1\книги"
for /f "delims=" %%i in ('dir /ad /b /s') do (
if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (zip, rar, 7z) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\..\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" x -t* "%%~b" -o"%nrp%\.." -y
 del "%%~b"
))
pause
Запаковка
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo Введите имя папки
set /p a=
cd /d "c:\1\книги" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (fb2) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\..\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" a "%nrp%\..\%%~nxb.zip" "%%~b"
 del "%%~b"
))
pause
Добавлено через 8 минут
Итак. Распаковка:
Структура:
Код
c:\1\книги\Папка для тестов архивы\тут еще подпапки с архивными файлами и нет.
c:\1\книги\Папка для тестов неархивы\тут еще подпапки с файлами разных расширений.
Запускаю батник для распаковки (см.выше)
Ввожу вручную "Папка для тестов архивы" только без кавычек.
Все, что нужно распаковывается одним списком в папку "книги", архивы из папки и подпапок "Папка для тестов архивы" удаляются, неархивы остаются.

Добавлено через 2 минуты
Запаковка, аналогично распаковке.
Запускаю батник для распаковки (см.выше)
Ввожу вручную "Папка для тестов неархивы" только без кавычек.
Все, что нужно и как нужно запаковывается одним списком в папку "книги", оригиналы из папки и подпапок "Папка для тестов неархивы" удаляются, файлы, которые не нужно запаковывать остаются.

Добавлено через 9 минут
С этим тоже разобрался
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
Setlocal EnableDelayedExpansion
 
set "in=c:\1\книги"
set "file=%~1"
 
 
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
    for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
    if /i not "%%~xb"==".7z" (
        >nul "c:\Program Files\7-Zip\7z.exe" a "%%a\%%~nb.7z" "%%a\%%b"
        del /q "%%a\%%b"
        ) else (
        >nul "c:\Program Files\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
        del /q "%%a\%%b"
            )
        )       
    ) else (
    echo Директория не найдена
))
exit /b
набираю
Код
inout.bat "Папка для тестов архивы"
Все в папке запаковывается по второму разу в архив 7z и что нужно и что не нужно

набираю
Код
inout.bat "Папка для тестов неархивы"
Все точно также запаковывается в 7z.

Но все разложено по подпапкам, как и было.

Где же переключение на запаковку-распаковку.
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
31.08.2015, 13:32 24

Не по теме:

Цитата Сообщение от Nik782 Посмотреть сообщение
Как это? Одновременно? Или где то переключатель?
Урри, где у него кнопка? :)


Скрипт проверяет наличие упакованных в 7z архивов, если находит архивы, то распаковывает их, если не находит архивы, до упаковывает файлы в архивы. Батник запускается с параметром, например
Код
my_bat.cmd "имя папки"
Всё, что есть в папке, включая файлы и какие-либо архивы упакуются в 7z. При повторном запуске батника с этим-же параметром файлы распакуются до исходных.
1
31.08.2015, 13:32
alpap
2144 / 1448 / 486
Регистрация: 26.04.2015
Сообщений: 4,921
31.08.2015, 14:02 25
Nik782, Если нужна распаковка именно в папку, которую ввели при запросе, то:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo Введите имя папки
set /p a=
cd /d "c:\1\книги" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
 if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (zip, rar, 7z) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" x -t* "%%~b" -o"%nrp%" -y
 del "%%~b"
))
pause
тогда так.

Добавлено через 2 минуты
И, соответственно для запаковки:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo Введите имя папки
set /p a=
cd /d "c:\1\книги" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
 if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (txt, bat, bmp) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" a "%nrp%\%%~nxb.zip" "%%~b"
 del "%%~b"
))
pause
Добавлено через 6 минут
Если такой вариант устраивает по всем параметрам на данном этапе, могу вечером (ночью, наверное) сделать через контекстное меню отдельным пунктом - по выбору ПКМ, но только вопрос, или же будете каждый раз в батнике перебивать необходимые расширения или дать возможность выбора ввести самому какие надо или будут какие-то по-умолчанию и из них удалить ненужные и добавить нужные, с вариантом выбора из списка не хочу возиться.
1
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 14:30  [ТС] 26
Цитата Сообщение от sov44 Посмотреть сообщение
Всё, что есть в папке
Но не нужно же все, что есть. нужно упаковать файлы только с определенными расширениями. Например jpg зачем паковать? И так архив. и паковать нужно не в 7z, а в zip
т.е.
Энциклопедия загадочных мест России - 2004.djvu останется как есть
а
Энциклопедия загадочных мест Земли (мира).fb2 запакуется в Энциклопедия загадочных мест Земли (мира).fb2.zip
Цитата Сообщение от alpap Посмотреть сообщение
Если нужна распаковка именно в папку, которую ввели при запросе
Нужна распаковка в те места, где находятся архивы. Т.е. распакованный файл должен заменить архив.

Я тут начал читать... )))
Может в начале батника так нужно? Или что то подобное.
Использовать переменную %0 в качестве исходной папки ? ))) Правильно?
А в качестве аргумента переменную %1 ))) Как у sov44
Windows Batch file
1
2
3
@echo off
set "in=%~0"
set "file=%~1"
Здесь вообще можно прикреплять картинки? Отправил бы скриншоты с компа. Для пояснений )

Добавлено через 1 минуту
Цитата Сообщение от alpap Посмотреть сообщение
каждый раз в батнике перебивать необходимые расширения
Расширения будут заданы раз и навсегда, просто именно сейчас я ещё не могу определиться.

Добавлено через 5 минут
Цитата Сообщение от alpap Посмотреть сообщение
Если такой вариант устраивает по всем параметрам на данном этапе
Так не работает же
Распаковывает РЯДОМ с папкой, а нужно вместо архивов.
И запаковывает РЯДОМ с папкой, а нужно вместо оригиналов.

Через контекстное меню конечно хорошо, но если сложно, можно и через перемекнные. Сейчас попробовал два раза Ctrl-Enter жамкнуть у меня получается в два-три раза быстрее, чем по контекстному меню искать.
Но плюс контекстного меню - отвязка от обязательности присутствия батника рядом. Если делать по контекстному, то нужно чтобы действия выполнялись именно над папкой на которой курсор.

Добавлено через 6 минут
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
echo Введите имя папки
set /p a=
cd /d "c:\1\книги" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
 if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (zip, rar, 7z) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" x -t* "%%~b" -o"%nrp%" -y
 del "%%~b"
))
pause
Распаковалось на один уровень ниже, но все равно в одну кучу из всех подпапок.

Добавлено через 52 секунды
0
alpap
2144 / 1448 / 486
Регистрация: 26.04.2015
Сообщений: 4,921
31.08.2015, 14:38 27
Nik782, В последних моих батниках распаковка и упаковка будет именно в папку с которой пляшем, но как я понял сначала в нее надо распаковать все архивы что в ней и ниже по папкам, теперь понял что с этой папки и ниже надо к в ней так и ниже в каждой именно архивы распаковать или упаковать - у меня немного не так, а код sov44, правильно работает, проверяли?, я просто не смотрел.
0
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 14:56  [ТС] 28
Может так?
Windows Batch file
1
2
3
@echo off
set "a=%~1"
cd /d "%~0"
Добавлено через 2 минуты
Цитата Сообщение от alpap Посмотреть сообщение
а код sov44, правильно работает, проверяли?
правильно, но все подряд пакует а 7z )))
Цитата Сообщение от alpap Посмотреть сообщение
теперь понял что с этой папки и ниже надо
надо заменять неархивы архивами (или архивы неархивами) на тех же самых местах, не перемещая

Добавлено через 4 минуты
Попробовал

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
set "a=%~1"
cd /d "%~0" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (zip, rar, 7z) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\..\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" x -t* "%%~b" -o"%nrp%\.." -y
 del "%%~b"
))
pause
Отлично работает, но по прежнему все в одну кучу

Добавлено через 3 минуты
Даже третья строка возможно лишняя. Вроде как масло масляное.

Добавлено через 2 минуты
Надо добавить...

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
Setlocal EnableDelayedExpansion
set "a=%~1"
cd /d "%~0" 
for /f "delims=" %%i in ('dir /ad /b /s') do (
if "%a%"=="%%~nxi" set "nrp=%%~i"
)
for %%a in (zip, rar, 7z) do (
 for /f "delims=" %%b In ('dir /b /s /a-d "%nrp%\..\*.%%a" 2^>nul') do (
  "c:\Program Files\7-Zip\7z.exe" x -t* "%%~b" -o"%nrp%\.." -y
 del "%%~b"
))
pause
Добавлено через 2 минуты
Пытаюсь как то ваши два кода совместить ))
Один код правильно раскладывает по папкам...
Второй код правильно выполняет действия ...
0
alpap
2144 / 1448 / 486
Регистрация: 26.04.2015
Сообщений: 4,921
31.08.2015, 18:54 29
Цитата Сообщение от Nik782 Посмотреть сообщение
надо заменять неархивы архивами (или архивы неархивами) на тех же самых местах, не перемещая
- ну вот это я уже и понял, до этого я все перемещал в папку оттанцовки, буду переделыввать теперь. И все-таки не услашал четкого ответа как работает код sov44, что в нем не устраивает, кроме того что пакует в 7z - это-то легко поменять, а архивы создает на своих местах, где Вы хотели, теперь уже ясна задача или как у меня тоже в папке старта?

Добавлено через 2 минуты
Да, еще путь к самому батнику вообще-то правильно писать так:
Windows Batch file
1
cd /d "%~dp0"
.
1
b0gus
286 / 180 / 78
Регистрация: 17.03.2014
Сообщений: 512
31.08.2015, 19:27 30
alpap,
Цитата Сообщение от alpap Посмотреть сообщение
Да, еще путь к самому батнику вообще-то правильно писать так:
Rob van der Woude отмечал, что предпочтительнее(?) так:
Windows Batch file
1
pushd %~dp0
1
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 21:49  [ТС] 31
Цитата Сообщение от alpap Посмотреть сообщение
как работает код sov44
Ну как работает... Т.к. у меня нет архивов 7z? он просто все подряд пакует в 7z. И существующие архивы по второму разу. А так то да, все на своих местах. И в оригинале привязан к основной папке
Windows Batch file
1
set "in=c:\1\книги"
а нужно запускать из любого места, но это вроде работает если данную строчку поменять на
Windows Batch file
1
set "in=%~0"
сейчас поэкспериментирую с его кодом.
Ваш код тоже работает, только итговые файлы не помещает куда нужно. Остальное гуд!

Добавлено через 16 минут
Отчитываюсь:
При замене
Windows Batch file
1
set "in=c:\1\книги"
на
Windows Batch file
1
set "in=%~0"
не работает.

При исходном варианте работает по структуре нормально.
Но только в пределах заданной директории "c:\1\книги", что, в принципе, устраивает. Хотя бОльшая мобильность не помешает, для работы на разных компьютерах с синхронизацией через облако. Но это уже капризы. Я могу для каждого компьютера разный батник сделать.

Значит структуру соблюдает. Работает как переключатель. Т.е. первый проход пакует все в 7z, но если встречается архив 7z, то он его распаковывает ))) При следующем проходе точно также. Пакует все, что видит в 7z, а архивы 7z распаковывает обратно.
Т.е. если в папке 3 архива и 2 неархива. То после прохода будет 3 неархива и 2 архива. И т.д. Однородности не добиться.
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
31.08.2015, 22:13 32
Цитата Сообщение от Nik782 Посмотреть сообщение
Т.е. если в папке 3 архива и 2 неархива. То после прохода будет 3 неархива и 2 архива. И т.д. Однородности не добиться.
За порядок в папках спрос с вас. Сегодня прогнали в не архивы одну директорию, завтра прогоните в не архивы директорию на два уровня выше, снова будет винигрет из архивов и не архивов.
Тут видимо нужно менять логику работы скрипта. Например, сканируется вся папка с книгами и перепаковываются все не архивы в архивы (априори их не должно быть много), затем распаковываются файлы из директории, заданной аргументом командной строки. И так при каждом запуске - ранее распакованные запаковываются, новые распаковываются для чтения. Если есть иное предложение по логике, предлагайте.
0
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
31.08.2015, 23:44  [ТС] 33
Цитата Сообщение от sov44 Посмотреть сообщение
сканируется вся папка с книгами и перепаковываются все не архивы в архивы
Вы же успели скачать пока робот не убрал ссылку, мой короткий пример?
Дело в том, что у меня информация, а не только книги.
Ну ладно, для простоты, пусть будут только книги. Но форматы то разные. Например: PDF, DJVU, TXT, FB2
Так вот запаковать нужно из этих четырех только TXT и FB2, таким образом, чтобы при совпадении имен не было наложений, т.е. пусть в исходной папке 4 файла
Код
имя1.pdf
имя2.djvu
имя3.txt
имя3.fb2
После работы скрипта архивации должно получиться
Код
имя1.pdf
имя2.djvu
имя3.txt.zip
имя3.fb2.zip
После работы скрипта разархивации содержимое папки должно вернуться в исходное состояние.

Добавлено через 9 минут
Цитата Сообщение от sov44 Посмотреть сообщение
априори их не должно быть много
Я понимаю глубинный смысл этой фразы, но их реально много.
Простая математика не дает ответа когда я успел столько прочитать ))
Магия какая-то...
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
01.09.2015, 08:32 34
Цитата Сообщение от Nik782 Посмотреть сообщение
из этих четырех только TXT и FB2
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
Setlocal EnableDelayedExpansion
 
set "in=c:\1\книги"
set "file=%~1"
 
 
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
    for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
        if /i not "%%~xb"==".zip" (
            for %%s in (txt,fb2) do (
                if /i "%%~xb"==".%%s" (
        >nul "%ProgramFiles%\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
        del /q "%%a\%%b"
                    )
                )
            ) else (
        >nul "%ProgramFiles%\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
        del /q "%%a\%%b"
            )
        )       
    ) else (
    echo Директория не найдена
))
exit /b
1
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
01.09.2015, 11:29  [ТС] 35
sov44, спасибо!
Работает!!!
Но...
1. Скрипт выполняет действия не над конкретной папкой, которая указана в виде аргумента, а над ВСЕМИ папками с теми же названиями в Главной директории "с:\1\книги".
Т.е. Если имеем допустим ряд авторов у которых есть одинаковые подпапки, например "Публицистика", то при выполнении действий с этой папкой, выполнятся действия со всеми папками "Публицистика" в дереве, начиная с "с:\1\книги". Проверил. Действительно есть такое ((
Можно ли заставить скрипт работать в любом месте, как самостоятельный элемент? И только над той папкой (и ниже), которвя указана? Если нет, пусть остается так, попробую работать только с папками - "Авторами"

2. Вообще хорошая идея совмещения скриптов. Два-в-одном. Но на данном этапе мне желательно все же два скрипта. Т.к. они и нужны именно для приведения в порядок коллекции. Подготовку к синхронизации через облако с выправленными атрибутами. А сейчас после работы скрипта придется просматривать все подпапки, чтобы выяснить не осталось ли где-то обратно-ковертированных файлов.

Можно ли добавить в скрипт ключик-триггер?
Ввести какую-нибудь переменную и условие. Пусть эту переменную буду задавать вручную внутри файла.
1. Только архивирование
2. Только разархивирование.
3. Циклическая работа.
Или более простой путь, хотя и не такой изящный, отдельный скрипт "разархивирование всего".

Но и в этом варианте уже очень даже хороший инструмент, с которым можно начинать работать, зная эти нюансы.
Большое Спасибо!

P.S. или лог файл, или просто в командной строке после окончания работы пусть появится "столько то файлов заархивировано, столько то разархивировано" Если не будет хотя бы одного нуля, то найду вручную где непорядок.

Добавлено через 10 минут
P.P.S. вообще идея со счетчиком и мини-отчетом запала )) Элемент осознанности действий. Это сложно сделать?
Тогда, в принципе триггер не нужен.

Подумал... п.1 - это уже каприз. Вполне могу обойтись.
п.2. при наличии мини-отчета тоже особо не нужен.

Добавлено через 8 минут
Лог-файл тоже не особо, только замедлит работу, искать его, открвать...
достаточно беглого взгляда на экран, чтобы оценить работу скрипта.
Ну т.е. кажется это так бывает?
Код
Создано архивов - 0
Разархивировано - 16
Для продолжения нажмите любую клавишу...
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
01.09.2015, 11:59 36
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Цитата Сообщение от Nik782 Посмотреть сообщение
Можно ли добавить в скрипт ключик-триггер?
Добавил вторым аргументом
p = упаковать
u = распаковать
a = циклично
пример запуска упаковки.
Код
my_bat.cmd "папка для обработки" p
Цитата Сообщение от Nik782 Посмотреть сообщение
вообще идея со счетчиком и мини-отчетом запала )) Элемент осознанности действий. Это сложно сделать?
сделал, лог создаётся рядом с батником. Но в 866 кодировке (лень добавлять Chcp, я пользуюсь акелом )
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@echo off
Setlocal EnableDelayedExpansion
 
set "in=c:\1\книги"
set "log=%~dp0my_log.txt"
set "file=%~1"
set "make=%~2"
 
if /i "%make%"=="p" goto pack
if /i "%make%"=="u" goto unpack
if /i "%make%"=="a" goto all
Echo Не правильно сделан выбор задания
pause>nul
exit /b
 
:pack 
>"%log%" Echo. Упаковано
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
set /a n+=1
>>"%log%" Echo. !n! "%%a\%%b"
>nul "%ProgramFiles%\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
))))) else (echo Директория не найдена)
)
exit /b
 
:unpack 
>"%log%" Echo. Распаковано
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i "%%~xb"==".zip" (
set /a n+=1
>>"%log%" Echo. !n! "%%a\%%b"
>nul "%ProgramFiles%\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
))) else (echo Директория не найдена)
)
exit /b
 
 
:all 
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
>nul "%ProgramFiles%\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
))) else (
>nul "%ProgramFiles%\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
))) else (echo Директория не найдена)
)
exit /b
3
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
01.09.2015, 18:06  [ТС] 37
alpap, sov44, большое спасибо!
Писал сейчас полчаса, что еще доделать по мелочи...
Лог по другому, отчет на экран...Потом стало стыдно, чего я с мелочевкой )
Полез в интернет, почитал... И вот ... Доделал сам.
70-80% ввода делаю с клавиатуры. Настроил в ТС переход в командную строку по CTRl-Tab
Получилось неплохо Ctrl-Enter, Выбор папки, Ctrl-Enter, Ctrl-Tab, http://www.cyberforum.ru/cgi-bin/latex.cgi?\Rightarrow, аргумент, Enter.
Учитывая, что это вспомогательная процедура и не такая частая, то даже лучше чем неплохо. Если задать аргумент внутри скрипта, то как и хотел вначале две кнопки, но появляется "хвост" из второго батника. Но это утрясется по ходу дела. Вроде все, что я хотел, и даже придумал по ходу, скрипт делает.
Для полного счастья осталось внедрить его в тотал коммандер на контекстное меню ))

Вот мои изменения. Критикуйте ))
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@echo off
Setlocal EnableDelayedExpansion
 
set "in=c:\1\книги"
set "log=c:\1\книги\my_log.txt"
set "file=%~1"
set "make=%~2"
set /a countp=0
set /a countu=0
 
if exist "%log%" goto go
@echo "Лог создан" %time%>"%log%"
:go
 
if /i "%make%"=="p" goto pack
if /i "%make%"=="u" goto unpack
if /i "%make%"=="a" goto all
Echo Не правильно сделан выбор задания
pause>nul
exit /b
 
:pack 
>>"%log%" Echo. %time% Упаковано
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
set /a n+=1
>>"%log%" Echo. !n! %time% "%%a\%%b"
>nul "c:\Program Files\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
set /a countp=countp+1
))))) else (echo Директория не найдена)
)
echo Упаковано - %countp%
pause >nul
exit /b
 
:unpack 
>>"%log%" Echo. %time% Распаковано
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i "%%~xb"==".zip" (
set /a n+=1
>>"%log%" Echo. !n! %time% "%%a\%%b"
>nul "c:\Program Files\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
set /a countu=countu+1
))) else (echo Директория не найдена)
)
echo Распаковано - %countu%
pause >nul
exit /b
 
 
:all 
>>"%log%" Echo. %time% "Обработано (упаковано и распаковано)"
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
>>"%log%" Echo. !n! %time% "%%a\%%b"
>nul "c:\Program Files\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
set /a countp=countp+1
))) else (
>>"%log%" Echo. !n! %time% "%%a\%%b"
>nul "c:\Program Files\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
set /a countu=countu+1
))) else (echo Директория не найдена)
)
echo Распаковано - %countu%
echo Упаковано - %countp%
pause >nul
exit /b
Добавлено через 6 минут
Цитата Сообщение от Nik782 Посмотреть сообщение
внедрить его в тотал коммандер
а может это и лишнее

Добавлено через 28 минут
Так...
Пожалуй время указывать достаточно лишь перед началом цикла.
Перед каждым файлом - лишнее.

А еще лишнее - полный путь (в логе)
Достаточно пути от папки в аргументе (включая эту самую папку).
Как исправить строчку?
Windows Batch file
1
>>"%log%" Echo. !n! "%%a\%%b"
чтобы выводился путь
  1. без %in%
  2. начиная с %%~1%
посмотрю какой вариант удобней
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
01.09.2015, 19:18 38
Цитата Сообщение от Nik782 Посмотреть сообщение
if exist "%log%" goto go
@echo "Лог создан" %time%>"%log%"
:go
Цитата Сообщение от Nik782 Посмотреть сообщение
>>"%log%" Echo. %time% Упаковано
Если лог есть, он дописывается. Для чего "раздувать" лог? Нужна полная история паковки-распаковки?
Цитата Сообщение от Nik782 Посмотреть сообщение
set /a countu=countu+1
Это работает?
0
Nik782
0 / 0 / 0
Регистрация: 29.08.2015
Сообщений: 20
01.09.2015, 21:33  [ТС] 39
Цитата Сообщение от sov44 Посмотреть сообщение
Если лог есть, он дописывается. Для чего "раздувать" лог? Нужна полная история паковки-распаковки?
Нет, в изначальном варианте не дописывался. Каждый раз создавался заново.
Интуитивно понял, что наверное количество ">" влияет. Если ">" - создается, ">>" - дописывается.
В общем то лог изначально и не предполагался. Это уже так, по ходу дела возникло. Шашечки на такси. Идея была отследить пересортицу в папках при ключе "а". При наличии ключей "р" и "u" потерял смысл. Можно прогнать сначала что-то одно. Но запас карман не тянет. Диск большой. Файл маленький. У меня есть подпапка для временных файлов, с которыми работаю, там будет лежать, никому не мешать. Для оперативной фиксации возможной ошибки в лог все равно неудобно лазить, так что пусть копится ))
Сдела пометки в логе в начале строки. сразу видно, если была пересортица.
Цитата Сообщение от sov44 Посмотреть сообщение
Это работает?
да. И отлично. Во всех режимах. Появляется на экране результат.

А как укоротить путь в логе?

Оставлю итоговый на этот момент вариант здесь, для большей сохранности
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
@echo off
Setlocal EnableDelayedExpansion
 
set "in=c:\1\книги"
set "log=c:\1\книги\my_log.txt"
set "file=%~1"
set "make=%~2"
set /a countp=0
set /a countu=0
 
if exist "%log%" goto go
@echo "Лог создан" %date% %time%>"%log%"
:go
 
if /i "%make%"=="p" goto pack
if /i "%make%"=="u" goto unpack
if /i "%make%"=="a" goto all
Echo Не правильно сделан выбор задания
pause>nul
exit /b
 
:pack 
>>"%log%" Echo. %date% %time% Старт упаковки
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
set /a n+=1
>>"%log%" Echo. !n! + %%a\%%b
>nul "c:\Program Files\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
set /a countp=countp+1
))))) else (echo Директория не найдена)
)
>>"%log%" Echo. Упаковано - %countu%
echo Упаковано - %countp%
pause >nul
exit /b
 
:unpack 
>>"%log%" Echo. %date% %time% Старт распаковки
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i "%%~xb"==".zip" (
set /a n+=1
>>"%log%" Echo. !n! - %%a\%%b
>nul "c:\Program Files\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
set /a countu=countu+1
))) else (echo Директория не найдена)
)
>>"%log%" Echo. Распаковано - %countu%
echo Распаковано - %countu%
pause >nul
exit /b
 
 
:all 
>>"%log%" Echo. %date% %time% Старт упаковки и распаковки
for /f "delims=" %%a in ('dir /b /s /ad "%in%\*" ^|find /i "%~1" ') do (
if /i exist "%%a" (
for /f "delims=" %%b in ('dir /b /a-d "%%a\*" 2^>nul') do (
if /i not "%%~xb"==".zip" (
for %%s in (txt,fb2) do (
if /i "%%~xb"==".%%s" (
>>"%log%" Echo. !n! + %%a\%%b
>nul "c:\Program Files\7-Zip\7z.exe" a "%%a\%%~nxb.zip" "%%a\%%b"
del /q "%%a\%%b"
set /a countp=countp+1
))) else (
>>"%log%" Echo.  !n! - %%a\%%b
>nul "c:\Program Files\7-Zip\7z.exe" e "%%a\%%b" -o"%%a"
del /q "%%a\%%b"
set /a countu=countu+1
))) else (echo Директория не найдена)
)
>>"%log%" Echo. Распаковано - %countu%
>>"%log%" Echo. Упаковано - %countp%
echo Распаковано - %countu%
echo Упаковано - %countp%
pause >nul
exit /b
Добавлено через 6 минут
И что значит !n! ?
Пробовал убирать - ничего не меняется ))
Извините за ламерские вопросы.

Добавлено через 7 минут
Цитата Сообщение от Nik782 Посмотреть сообщение
И что значит !n! ?
Пробовал убирать - ничего не меняется ))
Вот я тупик. Все понял. Когда внимательно посмотрел )
0
sov44
1761 / 745 / 128
Регистрация: 09.04.2011
Сообщений: 1,319
01.09.2015, 21:47 40
Оставьте из счётчиков что нибудь одно в блоке
Windows Batch file
1
set /a n+=1
или
Windows Batch file
1
set /a countu=countu+1
0
01.09.2015, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2015, 21:47

Резервное копирование с исключением файлов с определёнными расширениями
Добрый день! Подскажите как реализовать резервное копирование с применением маски на исключение...

Извлечение файлов из архивов (исключая файлы с определёнными расширениями) и их переименование
Добрый день. Нужна помощь в создании батника - задача: В папке D:/back находятся разные...

Архивация по 50 файлов
Есть одна папка в которой n картинок. Я вбрасываю в нее и жму name.bat Скрипт создает внутри...


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

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

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