Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск файла внутри архивов, определение размера и сохранение результата. (http://forum.oszone.net/showthread.php?t=345784)

1specific 09-07-2020 10:11 2927745

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

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

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

Foreigner 09-07-2020 11:08 2927750

Код:

@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 2927753

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

Foreigner 09-07-2020 11:51 2927755

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 2927777

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 2927813

Цитата:

Цитата 1specific
не соображу как размер перевести в килобайты. »

Лень вычислять десятые. Для этого есть PowerShell. Что гораздо удобней cmd.

Цитата:

Цитата 1specific
Почему то в file.txt, если файл найден, то он добавляется туда несколько раз. »

Я писал из под другой ОС и не мог проверить

Цитата:

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

Добавил.

Код:

@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 2927820

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

Foreigner 09-07-2020 20:43 2927826

Цитата:

Цитата 1specific
то появляется ошибка "Непредвиденно появление .zip" »

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

1specific 09-07-2020 21:06 2927836

Foreigner, К сожалению не удается воспроизвести эту ошибку убрав @echo off. Если я убираю @echo off, то просто пробегается по архивам без ошибок.

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

Foreigner 09-07-2020 21:31 2927840

Может лучше 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 2927842

Код:

@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 2927878

Foreigner, Спасибо за Ваше активное участие! Кстати попробовал powershell, но тоже какую то ошибку выдало.
megaloman, Ваш скрипт сходу ушел в работу, то что нужно! Огромное спасибо!


Время: 03:50.

Время: 03:50.
© OSzone.net 2001-