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

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

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

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


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

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


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

Отправлено: 10:11, 09-07-2020

 

Ветеран


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

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


Код: Выделить весь код
@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

Последний раз редактировалось Foreigner, 09-07-2020 в 11:17.


Отправлено: 11:08, 09-07-2020 | #2



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

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


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


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

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


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

Отправлено: 11:37, 09-07-2020 | #3


Ветеран


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

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


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:51, 09-07-2020 | #4


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


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

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


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. Мелочь, но не соображу как размер перевести в килобайты.

Отправлено: 15:47, 09-07-2020 | #5


Ветеран


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

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


Цитата 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="
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:43, 09-07-2020 | #6


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


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

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


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

Отправлено: 20:05, 09-07-2020 | #7


Ветеран


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

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


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

Отправлено: 20:43, 09-07-2020 | #8


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


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

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


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

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

Отправлено: 21:06, 09-07-2020 | #9


Ветеран


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

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


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

Последний раз редактировалось Foreigner, 09-07-2020 в 21:51.


Отправлено: 21:31, 09-07-2020 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] поиск в реестре и сохранение результата в *.Reg sushnyak Скриптовые языки администрирования Windows 2 30-04-2024 22:50
CMD/BAT - [решено] Поиск файла наибольшего размера elis1 Скриптовые языки администрирования Windows 2 18-01-2013 11:37
VBS/WSH/JS - определение размера файла D_e_n_n Скриптовые языки администрирования Windows 9 24-02-2012 17:09
CMD/BAT - [решено] Поиск чисел внутри файла Hardip Скриптовые языки администрирования Windows 5 19-11-2010 15:20
Интерфейс - [решено] поиск внутри pdf файла ospa Microsoft Windows 7 8 08-11-2010 22:05




 
Переход