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

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

Ответить
Настройки темы
CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Новый участник


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

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


Добрый день!

В папке хранятся много zip архивов. Нужно сделать скрипт проверки zip архивов на наличие в нем Файла1 & Файла2. Если такой архив находится, то копировать его в другую папку.

Отправлено: 18:13, 07-11-2017

 

Ветеран


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

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


Угу. Не хватает такой простой команды как у rar — «vb», отобразить только имена с путями.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:11, 10-11-2017 | #11



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

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


Ветеран


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

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


Подправил, теперь просматривает и в глубь, проверял с именами файлов внутри, архивов и папок равных: "....A", единственно очень точным совпадением имен не утруждался
Код: Выделить весь код
@echo off
set "d_out=C:\b_arch"
set "exp=7z"
set "ar=%ProgramFiles%\7-Zip\7z.exe"
set "zf1=a.txt"& set "zf2=b.txt"

if not exist "%d_out%" md "%d_out%"
for /f "delims=" %%A in ('dir /a-d/b/s "*.%exp%"') do (
 setlocal enabledelayedexpansion
  for /f "tokens=5*" %%a in ('""%ar%" l -r "%%A"|findstr /r /c:"\^<%zf1%$" /c:"\^<%zf2%$""') do set /a n+=1& set "a!n!=%%A"
  if not "!a2!"=="" >nul copy "!a2!" "%d_out%"
 endlocal
)
pause

Последний раз редактировалось alpap, 10-11-2017 в 14:11.


Отправлено: 13:42, 10-11-2017 | #12


Ветеран


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

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


Цитата megaloman:
Пришлось делать промежуточный файл.
Меня это гнетёт. »
Вот без временного файла
ИДЕЯ И ПРИНЦИП КОДА РАЗРАБОТАНА megaloman - Благодарности ему.
(я только убрал временный файл и немного подрихтовал)
Код: Выделить весь код
@echo off
set "d_out=C:\b_arch"
set "exp=7z"
set "ar=%ProgramFiles%\7-Zip\7z.exe"
set "zf1=a.txt"& set "zf2=b.txt"

for /f "delims=" %%a in ('2^>nul dir /a-d/b/s "*.%exp%"') do call :# "%%a" "%d_out%" "%zf1%" "%zf2%" "%ar%"
pause& exit

:# [Архив] [Путь сохранения] [Файл1] [Файл2] [Архиватор]
 for /f "tokens=5" %%a in ('""%~5" l -r "%~1" "%~3" "%~4""') do 2>nul set /a n=%%a
 if %n% geq 2 (if not exist "%~2" md "%~2")& >nul copy "%~1" "%~2"
exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:35, 10-11-2017 | #13


Ветеран


Contributor


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

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


Цитата megaloman:
Пришлось делать промежуточный файл.
Меня это гнетёт. »
Спасибо alpap, подсмотрел как под For затолкать вызов архиватора.
мой исправленный вариант без промежуточного файла
Код: Выделить весь код
@Echo Off

Set "FileIn=Z:\Box_In\*.zip"

Set "Exists="data1.cab" "data2.cab""
Set /A NExists=2

Set "BoxOut=Z:\Box_Out"

Set "Arc="C:\Program Files\7-Zip\7z.exe" l -r"

FOR /F "usebackq delims=" %%i IN (`dir "%FileIn%" /S /B /A:-D 2^>nul`) DO Call :CheckZip "%%i"
GoTo :Eof

:CheckZip
	FOR /F "tokens=5 delims= " %%s IN ('"%Arc% %1 %Exists%"') DO Set /A N=%%s 2>nul
	If %N% GEQ %NExists% Copy %1 "%BoxOut%" >nul
GoTo :Eof
В моём варианте может рассматриваться одновременное наличие нескольких файлов, в частности, двух:
параметры:
Set "Exists="data1.cab" "data2.cab""
Set /A NExists=2
Вот вариант, который правильно обрабатывает архивы даже при наличии в них повторяющихся имён файлов
Код: Выделить весь код
@Echo Off

Set "FileIn=Z:\Box_In\*.zip"
Set "Exists="data1.cab" "data2.cab" "setup.exe""

Set "BoxOut=Z:\Box_Out"

Set "Arc="C:\Program Files\7-Zip\7z.exe" l -r"

FOR /F "usebackq delims=" %%i IN (`dir "%FileIn%" /S /B /A:-D 2^>nul`) DO Call :FilesExists "%%i"
GoTo :Eof

:FilesExists
	FOR %%f IN (%Exists%) DO Call :CheckZip %1 "%%~f" &&GoTo :Eof
	Copy %1 "%BoxOut%" >nul
GoTo :Eof

:CheckZip
	Set /A N=0
	FOR /F "tokens=5 delims= " %%s IN ('"%Arc% %1 %2"') DO Set /A N=%%s 2>nul
Exit /B %N%
Здесь для примера приведено наличие трёх файлов
Set "Exists="data1.cab" "data2.cab" "setup.exe""

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


Последний раз редактировалось megaloman, 10-11-2017 в 19:10.

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

Отправлено: 18:03, 10-11-2017 | #14


Ветеран


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

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


Цитата megaloman:
при наличии в них повторяющихся имён файлов »
ваш здесь первый вариант тоже прекрасно справляется при наличии одинаковых файлов в разных архивах (a и b, например заданы)
1 - a b c
2 - a b
3 - b c
1 и 2 - будут сохранены, проверялось.
или что-то другое под этим имеется ввиду?

Отправлено: 19:29, 10-11-2017 | #15


Ветеран


Contributor


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

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


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

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

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

Отправлено: 19:36, 10-11-2017 | #16


Ветеран


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

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


Ааа, вон оно что, о таком варианте я как-то даже не подумал проверить - не хватило фантазии, надо запомнить.

Отправлено: 19:40, 10-11-2017 | #17


Ветеран


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

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


alpap, megaloman, не смотрел код. Возможность указать оба искомых файла в командной строке:
Код: Выделить весь код
"C:\Program Files\7-Zip\7z.exe" l -r "Sample.7z" "File1.txt" "File2.txt"
использовалась?

Отправлено: 19:49, 10-11-2017 | #18


Ветеран


Contributor


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

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


Iska, угу, мой первый вариант

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


Отправлено: 20:20, 10-11-2017 | #19


Ветеран


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

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


Iska,
так точно пост #13

Отправлено: 23:10, 10-11-2017 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Массовая замена определенных файлов в определенных папках CMD/BAT urabusu Скриптовые языки администрирования Windows 6 27-06-2019 21:06
Проверка на наличие интернета Qweezy AutoIt 1 14-06-2017 13:37
CMD/BAT - [решено] Проверка папки на наличие файлов за сегодня FantomasAnand Скриптовые языки администрирования Windows 1 26-02-2015 04:04
CMD/BAT - Проверка на наличие процесса tazik9 Скриптовые языки администрирования Windows 0 23-01-2011 16:56
CMD/BAT - [решено] Проверка установки определенных файлов в директорию korenza Скриптовые языки администрирования Windows 17 03-06-2010 13:25




 
Переход