Показать полную графическую версию : [решено] Поиск файла внутри архивов, определение размера и сохранение результата.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.