Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Архивирование файлов определенного типа из подкаталогов

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


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

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


Добрый день.

Прошу помощи с написанием скрипта для решения такой задачи:
Вводные
Имеем множество папок, в каждой из которых есть файлы с различными расширениями и размерами соответственно.
  • Основная_папка\Подпапка1
  • Основная_папка\Подпапка2
  • Основная_папка\Подпапка3
и т.д.
Необходимо создать архивы из файлов находящихся в этих подпапках и сохранить их в "Основная_папка".
При этом:
1. Архив должен содержать только файлы определенного расширения ".ххх".
2. Архив должен именоваться названием файла наибольшего веса каждой отдельной подпапки.
3. Архив должен быть формата zip.
4. Архив должен иметь расширение файла ".yyy".

На данный момент использую следующий скрипт, запускаемый в "Основная_папка":
Код: Выделить весь код
FOR /D %%i IN (*) DO (
pushd "%%i"
"C:\Program Files\7-Zip\7zG.exe" a -tzip "..\%%~i.yyy" *
popd
)
Этот скрипт позволяет мне:
Создавать архивы из всех файлов находящихся в этих подпапках и сохранять их в "Основная_папка".
Называть архив именем подпапки.
Применять расширение ко всем архивам ".yyy".

Допускаемые инструменты:
WinRAR
7z - предпочтительно

Допускаемый вариант решения:
CMD/BAT
Powershell

Заранее спасибо.

Отправлено: 12:42, 28-04-2021

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Цитата more_than_hater:
Вываливается с ошибкой »
Исправил выше, пробуйте.
Старый вариант работал в PSv7, но в v5.1 почему-то нет.

Fors1k, как вы делаете подсветку кода здесь?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:32, 29-04-2021 | #21



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

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


Аватара для Fors1k

Старожил


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

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


Цитата more_than_hater:
Параллельно изучаю скрипт Ув. Fors1k. Я так понял - у него происходит примерно то, что написал ранее. »
Да, с названием папки сравниваются все файлы.
Цитата DJ Mogarych:
Fors1k, как вы делаете подсветку кода здесь? »
Как-то раз было нечем заняться, и решил написать скрипт, который будет одним кликом подсвечивать синтаксис поша

Последний раз редактировалось Fors1k, 29-04-2021 в 14:45.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:25, 29-04-2021 | #22


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


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

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


Цитата DJ Mogarych:
Исправил выше, пробуйте. »
Скрипт заработал. Можете подсказать, как решили проблему? Старый вариант скрипта не сохранил,потому провести сравнение не могу. Интересно.

Сделали четко по ТЗ, здесь вопросов нет.
В ходе тестирования скриптов Ув. Elven и Ув. Fors1k обнаружил проблему, что отборка по размеру файла - не всегда есть хорошо. Попадаются ситуации, когда самый крупный по размеру файл в подпапке - не является нужным. Ув. Fors1k использовал в своем скрипте метод отбора substring(0,4) - где 0 - с какого символа начинать сравнение и 4 - по какой символ включительно заканчивать сравнение. В сравнении учавствуют все файлы.

Т.к. знаний для написания своих команд мне на текущий момент нехватает (читать доки не перечитать) - попробовал использовать строку кода со скрипта Ув. Fors1k, модифицировав ваш, однако на выходе $name не применяется:
Скрытый текст

Код: Выделить весь код
$dir = "C:\Users\admin\Documents\Raccoon\content\test_apps"
$ext = "*.apk"

dir "$dir" -Directory |? {[System.IO.Directory]::EnumerateFiles("$($_.fullname)", "$ext", "Alldirectories")} |% {
$name = (Get-ChildItem -Path $dir $ext|Where-Object{"$_".substring(0,4) -eq "$dir".substring(0,4)}).BaseName
$files |Compress-Archive -DestinationPath ($zip = "$dir\$((get-date).ToString("yyyy-MM-dd-hh-mm-ss"))-$name.zip")
Rename-Item "$zip" -NewName ($zip -replace "zip$","apps")
}

Пробовал запускать скрипт через отладку в ISE - ошибку не выводит. Можете разъяснить, почему все "так просто" не происходит? Вроде все переменные совпадают...

P.S.
Скрипт Ув. Elven закончил работу с 13 папками за 53,9 сек
Скрипт Ув. Fors1k закончил работу с 13 папками за 28,7 сек

Тоже хотелось бы понять, почему так происходит. Очень "грубо догадываясь" - в скрипте Ув. Elven красиво расписан переход от процедуре к процедуре, из за чего длинна кода увеличена, что способствует уменьшению скорости работы. В это же время, Ув. Fors1k решил не расписывать переходы и сделать код "все в одной строке", из-за чего разобраться в нем чуть сложнее, но работает в разы быстрее.

Может кто-то объяснить более внятно, почему такая разница в скорости?

Еще раз всем спасибо за потраченное время на проходящего мимо ламера.

Последний раз редактировалось more_than_hater, 29-04-2021 в 17:20.


Отправлено: 17:10, 29-04-2021 | #23


Аватара для Elven

Ветеран


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

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


more_than_hater, все гораздо проще - я в массиве два раза ковыряюсь .

Отправлено: 17:25, 29-04-2021 | #24


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Цитата more_than_hater:
закончил работу с 13 папками за »
А мой?
Цитата more_than_hater:
Можете подсказать, как решили проблему? »
Powershell 7 более догадлив, в частности, ему можно просто бросить объект каталога, и он сам поймёт, что нужно из него брать. В версии 5.1 нужно явно пихать полный путь.
То же и с расширением при упаковке. PS7 пофигу, какое расширение файла будет при упаковке, а PS5.1 ругается и требует, чтобы это обязательно было .zip, из-за этого пришлось дополнительно дописывать процедуру переименования.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 17:48, 29-04-2021 | #25


Аватара для Fors1k

Старожил


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

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


Цитата more_than_hater:
разобраться в нем чуть сложнее »
Обычно редко кто хочет вникать в работу скрипта. Если вам интересно разобраться, то вот код по шагам:
Код: Выделить весь код
cls
$ext = "*.apk"

#Set-Location "D:\Основная_папка"

ForEach($dir in Get-ChildItem -Directory){
    $files = (Get-ChildItem $dir -Filter $ext -file).BaseName
    $name  = $files|Where{"$_".StartsWith($dir)}|select -First 1
    if($name -and !(Test-Path "$name.apps")){
        Compress-Archive $dir\$ext "$name.zip" -compress Fastest
        Rename-Item "$name.zip" "$name.apps"
    }
}
 
Для запуска из ise уберите комментарий(#) перед Set-Location.

Для понимания кода просто переводите слова на русский
Например: Get-ChildItem $dir -Filter $ext -file = получи дочерние объекты в $dir по фильтру $ext -только файлы.

Последний раз редактировалось Fors1k, 29-04-2021 в 18:40.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:32, 29-04-2021 | #26


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


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

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


Цитата DJ Mogarych:
А мой? »
А Ваш сравнить, к сожалению, не смог, т.к. у Вас отбор идет по весу файла. Отобрал эти самые 13 проблемных папок, и сравнивал уже на них скорость. Простите Честно пытался модифицировать сам, но не вышло...

Цитата DJ Mogarych:
Powershell 7 более догадлив »
А можно обновиться? Билд win10 pro последний, 7 в бета-тесте может?

Цитата Fors1k:
Обычно редко кто хочет вникать в работу скрипта »
Не вникать было бы неуважительно по отношению к тем, кто писал этот скрипт. Да и, если честно, интересно научиться самому и писать и помогать другим (уже на опыте).

Отправлено: 20:47, 29-04-2021 | #27


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


PS7 ставится рядом, он не заменяет установленный PS5.1.
Код: Выделить весь код
# Установить PS 7
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:05, 30-04-2021 | #28


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


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

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


Господа, приветствую еще раз.
Возникла потребность модифицировать скрипт написанный Вами ранее.
Каждая из папок может содержать как старые файлы, так и один единственный файл
Самый сложный случай:
Если в папке находится несколько файлов с разной датой (день) - то выбирать только самые новые файлы для дальнейшей работы с ними.
Если таких файлов несколько (день) - то архивировать их и все так-же переиминовывать архив в .xxx
Если такой файл один (день) - то не архивировать его, а просто копировать в ту же папку, где запускается текущий скрипт.

Т.е., нужно добавить проверку по дате (newest per day) и по кол-ву файлов внутри этой самой даты.

Заранее спасибо.

Отправлено: 15:14, 27-05-2021 | #29



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Определение суммарного объема файлов определенного типа kelevara Скриптовые языки администрирования Windows 16 02-05-2013 20:55
VBS/WSH/JS - Копирование файлов из каталогов и подкаталогов с сохранением структуры подкаталогов spke Скриптовые языки администрирования Windows 0 10-04-2013 23:58
CMD/BAT - [решено] Выбор определенного типа файлов при копировании Aleksander.Ruban@fb Скриптовые языки администрирования Windows 4 25-08-2012 10:21
Log/Monitoring - Запрет на запись файлов определенного типа и размера andrei.ru Сетевые технологии 1 20-11-2009 11:53
скачивание файлов определенного типа NIGHT_ANGEL Хочу все знать 11 25-02-2005 06:41




 
Переход