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

Аватара пользователя
alpap

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение alpap »

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

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение alpap »

Подправил, теперь просматривает и в глубь, проверял с именами файлов внутри, архивов и папок равных: "....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

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение alpap »

Цитата megaloman:



Пришлось делать промежуточный файл.

Меня это гнетёт.
CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов




Вот без временного файла

ИДЕЯ И ПРИНЦИП КОДА РАЗРАБОТАНА 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
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение megaloman »

Цитата megaloman:



Пришлось делать промежуточный файл.

Меня это гнетёт.
CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов




Спасибо alpap, подсмотрел как под For затолкать вызов архиватора.


мой исправленный вариант без промежуточного файла

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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


Вот вариант, который правильно обрабатывает архивы даже при наличии в них повторяющихся имён файлов

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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""
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение alpap »

Цитата megaloman:



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




ваш здесь первый вариант тоже прекрасно справляется при наличии одинаковых файлов в разных архивах (a и b, например заданы)

1 - a b c

2 - a b

3 - b c

1 и 2 - будут сохранены, проверялось.

или что-то другое под этим имеется ввиду?
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение megaloman »

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

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение alpap »

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

Re: CMD/BAT - [решено] Проверка архива zip на наличие определенных файлов

Сообщение Iska »

alpap, megaloman, не смотрел код. Возможность указать оба искомых файла в командной строке:



Код:

Код: Выделить всё

"C:\Program Files\7-Zip\7z.exe" l -r "Sample.7z" "File1.txt" "File2.txt"

использовалась?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»