PDA

Показать полную графическую версию : [решено] Поиск файла внутри архивов, определение размера и сохранение результата.


1specific
09-07-2020, 10:11
Добрый час друзья!
Прошу у вас помощи, сам в cmd/batch примерно на уровне дуба. Однако тщательно погуглив мне не удалось найти решение моей задачи, поэтому спешу обратиться к вам :)

Имеем: Множество zip/rar архивов (Все лежат по пути E:\Backup\) больших объемов (от 300мб до 50гб). Внутри архивов множество файлов, каталогов и вложенных подкаталогов.

Требуется: не распаковывая эти архивы, произвести поиск по ним на наличие файла "Priority" (файл без расширения) и определить его размер.
В случае если данный файл найден, то сохранить в find.txt путь до этого файла внутри архива, и размер этого файла (разделитель табуляция или любой другой).

Что далее: я уже самостоятельно отфильтрую эти файлы по размеру, и с помощью нижеприведенного скрипта массово их распакую (включая все файлы рядом с ним и вложенные подкаталоги) в нужный мне каталог.

"C:\SOFT\7-Zip\7z.exe" x "E:\Backup\25-02-19.rar" "IPBS\*" -o"C:\1"
"C:\SOFT\7-Zip\7z.exe" x "E:\Backup\05_27-05-2019 1010.zip" "Data\*" -o"C:\1"
...

За ранее благодарю всех откликнувшихся)

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

Foreigner
09-07-2020, 11:08
@echo off
setlocal

for /f "tokens=*" %%i in ('7z l file.7z ^| findstr /e Priority') do (


for /f "tokens=4" %%j in ('echo %%i') do set "s=%%j"
for %%j in (%%i) do set "p=%%j"
)

echo %p%;%s% > find.txt

1specific
09-07-2020, 11:37
Foreigner, спасибо, однако:
1. Пишет ошибку: "7z" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
2. Мне требуется поиск по всем .zip и .rar архивам которые лежат по пути E:\Backup\. Либо я не понял вашего кода, либо я понял верно, и производится поиск только в конкретном файле file.7z

Foreigner
09-07-2020, 11:51
1specific,

1 - У меня симлинк на 7z.exe в %PATH%. Или создайте его, или пропишите в батнике полный путь к 7z.exe
2 - Тогда как-то так, но проверить уже не могу:


@echo off
setlocal

pushd E:\Backups

for /f "tokens=*" %%i in ('dir /b *.rar *.zip') do call:1 "%%i"
popd
goto:eof

:1
for /f "tokens=*" %%i in ('7z l %1 ^| findstr /e Priority') do (


for /f "tokens=4" %%j in ('echo %%i') do set "s=%%j"
for %%j in (%%i) do set "p=%%j"
)

echo %p%;%s% >> find.txt

1specific
09-07-2020, 15:47
Foreigner, Благодарю, уже что-то стало получаться, но остался ряд нюансов.
1. Почему то в file.txt, если файл найден, то он добавляется туда несколько раз.
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238
ТУ\Priority;338238

2. В file.txt не указывается название самого архива в котором был найден файл, а без этого никак :)
3. Мелочь, но не соображу как размер перевести в килобайты.

Foreigner
09-07-2020, 18:43
не соображу как размер перевести в килобайты. »
Лень вычислять десятые. Для этого есть PowerShell. Что гораздо удобней cmd.

Почему то в file.txt, если файл найден, то он добавляется туда несколько раз. »
Я писал из под другой ОС и не мог проверить

название самого архива в котором был найден файл »
Добавил.


@echo off
setlocal

pushd E:\Backups
for /f "tokens=*" %%i in ('dir /b *.zip *.rar') do call:1 "%%i"
popd
goto:eof

:1
for /f "tokens=*" %%i in ('7z l %1 ^| findstr /e Priority') do (

for /f "tokens=4" %%j in ('echo %%i') do set "s=%%j"
for %%j in (%%i) do set "p=%%j"
)

if defined s (set /a "s/=1024")
if defined p (echo %~nx1;%p%;%s% >> file.txt)

set "p="
set "s="

1specific
09-07-2020, 20:05
Foreigner, Спасибо за вашу помощь) Мне уже стыдно писать, но к сожалению извилин не хватает самому допилить и понять что не так.
Если запустить тот вариант который вы дали (последний), то появляется ошибка "Непредвиденно появление .zip".

Foreigner
09-07-2020, 20:43
то появляется ошибка "Непредвиденно появление .zip" »

Сложно сказать. У меня такой ошибки не возникает, попробуйте убрать '@echo off' и посмотрите вывод батника в консоль. На каком архиве он спотыкается.

1specific
09-07-2020, 21:06
Foreigner, К сожалению не удается воспроизвести эту ошибку убрав @echo off. Если я убираю @echo off, то просто пробегается по архивам без ошибок.

p.s. при этом file.txt не создается (неважно @echo off есть или нету, с ошибкой или без)
Пробовал с кодировками играться, тоже не помогло.((

Foreigner
09-07-2020, 21:31
Может лучше PowerShell?


Push-Location E:\Backups

foreach ($arc in (Get-ChildItem *.zip, *.rar))
{
7z l $arc | Where-Object { $_ -match '\\Priority$' } |
ForEach-Object {

$size,$path = ($_ -split '\s{2,}')[1,-1]
$arc.Name + ';' + $($size / 1kb).ToString('N') + ';' + $path | Add-Content file.txt
}
}

Pop-Location

megaloman
09-07-2020, 22:31
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Name=Priority"
Set "Mask="*.rar" "*.zip""
Set "OutFile=Z:\Box_Out\file.txt"

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

Pushd "%BoxIn%" &&(
>"%OutFile%" 2>&1 (FOR /F "usebackq delims=" %%a IN (`2^>nul Dir %Mask% /B /A:-D`) DO (
FOR /F "usebackq tokens=4,5* delims= " %%i IN (`""%Arc%" L "%%a" |findstr /I /E "%Name%""`) DO (
Set /A Skb=%%i+512
Call Set /A Skb=%%Skb%%/1024
Call Echo %%a %%Skb%%Kb %%k
)
))
Popd
)
pause
Exit /B

1specific
10-07-2020, 12:15
Foreigner, Спасибо за Ваше активное участие! Кстати попробовал powershell, но тоже какую то ошибку выдало.
megaloman, Ваш скрипт сходу ушел в работу, то что нужно! Огромное спасибо!




© OSzone.net 2001-2012