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

Компьютерный форум 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

 

Ветеран


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

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


Цитата more_than_hater:
наибольшего веса каждой отдельной подпапки »
интересно
но ведь вес .\Dir1\Dir11
входит в состав веса .\Dir1
когда мы будем искать наибольший это будут естественно корни
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:49, 28-04-2021 | #2



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

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


Аватара для Elven

Ветеран


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

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


Цитата more_than_hater:
1. Архив должен содержать только файлы определенного расширения ".ххх". »
Цитата more_than_hater:
4. Архив должен иметь расширение файла ".yyy". »
т.е. архивируем, например, *.docx а архив называем *.jpg?
со вторым пунктом тоже как-то не всё понятно. Их таки вместе заархивировать или каждый по отдельности?
из того как я понял:
Код: Выделить весь код
$archive_name = (Get-ChildItem ./*/*.xxx | Sort-Object -Property Length -descending | select -First 1).BaseName
(Get-ChildItem ./*/*.xxx).FullName | Compress-Archive -DestinationPath ./$archive_name.yyy
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:54, 28-04-2021 | #3


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


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

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


Цитата Elven:
т.е. архивируем, например, *.docx а архив называем *.jpg?
со вторым пунктом тоже как-то не всё понятно. Их таки вместе заархивировать или каждый по отдельности? »
1. Именно так
2. Каждый по отдельности. Дополнительный пример (в живую) под спойлером.
Скрытый текст


Цитата alpap:
интересно
но ведь вес .\Dir1\Dir11
входит в состав веса .\Dir1
когда мы будем искать наибольший это будут естественно корни »
Добавляем строку и под pushd считываем файлы только внутри одной папки, где далее делаем выборку. Далее "FOR" производит loop и считывает следующую папку применяя все команды в DO ()
Пример реализации под спойлером.
Скрытый текст

Тут осталось только сделать сортировку по весу файла с последующей выборкой имени у самого крупного файла в папке.

Немного усложняем задачу на 1 шаг вперед. Именовать архив нужно используя не fullname файла наибольшего по весу. Как именно нужно:
1. Узнаем fullname файла наибольшего по весу
2. Сравниваем найденый fullname с названием "Подпапки" (первых 6 символов будет достаточно) %var:~0,6%%"=="var2", где var - имя файла, а var2 - имя подпапки, в которой находятся файлы. Тот файл, который проходит проверку - является положительным результатом.
Сравнивать, например, можно так: %var:~0,7%%"==%var2
3. Применяем название архива, как "..\%%F.apps", где %%F=var

Пока писал, чуть сам не запутался... А может запутался...
Прописать это все на деле не хватает опыта. Надеюсь на вашу помощь

Последний раз редактировалось more_than_hater, 28-04-2021 в 16:58.


Отправлено: 16:27, 28-04-2021 | #4


Аватара для Elven

Ветеран


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

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


А нафига тогда размер файла подтягивать? я уже вообще ничего не розумею. короче вот:
Код: Выделить весь код
Get-ChildItem -Directory | ForEach-Object {
  if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Property Length -descending | select -First 1).BaseName.Remove(6)) {
    $archive_name = (Get-ChildItem $_/*.ps1 | Sort-Object -Property Length -descending | select -First 1).BaseName + ".yyy"
      if (!(Test-Path $archive_name -PathType Leaf)) {
        (Get-ChildItem $_/*.ps1).FullName | Compress-Archive -DestinationPath ./$archive_name
      } else {
        Write-Host "Уже есть такой файл: $archive_name "
      }
    } else {
      Write-Host "Не совпадают в  $_"
    }
}

Последний раз редактировалось Elven, 28-04-2021 в 18:12.

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

Отправлено: 17:14, 28-04-2021 | #5


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


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

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


Elven,
Скрытый текст

Код: Выделить весь код
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Исключение при вызове "Remove" с "1" аргументами: "startIndex должен быть меньше, чем длина строки.
Имя параметра: startIndex"
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException
 
Исключение при вызове "Remove" с "1" аргументами: "startIndex должен быть меньше, чем длина строки.
Имя параметра: startIndex"
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Исключение при вызове "Remove" с "1" аргументами: "startIndex должен быть меньше, чем длина строки.
Имя параметра: startIndex"
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:2 знак:7
+   if ($_.name.remove(6) -eq (Get-ChildItem $_/*.ps1 | Sort-Object -Pr ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Что-то ему не нравится...

Цитата Elven:
А нафига тогда размер файла подтягивать? »
Чтобы знать, с каким файлом проводить сравнение имени. Можно конечно сравнить со всеми файлами в папке, тут на вкус и цвет уже...

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


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


Аватара для Elven

Ветеран


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

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


Конечно будет ругаться. Не может он удалить символы ПОСЛЕ шестого, если символов МЕНЬШЕ 6 (можно выбрать число поменьше).
Далее, скрипт немного таки поменять нужно было (у меня не было пачки apk чтобы потестить на них, за то у меня было много файлов с другим расширением, которые разумеется не находятся у вас, за полным отсутствия присутствия оных).
Код: Выделить весь код
Get-ChildItem $_/*.ps1
например вот здесь.
Исправить это и должно заработать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:11, 28-04-2021 | #7


Ветеран


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

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


Elven, я так понял нужно вот эти имена подпапок найти:
Скрытый текст

C:\USERS\...\DESKTOP\PAPKA
├───Dir0
│ ├───Dir11 (самая большая подпапка в Dir1)
│ │ filea
│ │ fileb
│ │ filec
| |
│ │
│ ├───Dir12
│ │ fileab
│ │ filebc
| |
| |
│ │
│ └───Dir13
│ fileag
│ filean


├───Dir2
│ ├───Dir21
│ ├───Dir22
│ │ ├───Dir221 (самая большая подпапка в Dir2)
│ │ │ fileabb
│ │ │ fileanm
│ │ │ filebn
| | |
│ │ │
│ │ └───Dir222
│ └───Dir23
│ filebnm
│ filewer
│ filejkl
|

└───Dir3
├───Dir31
│ └───Dir331 (самая большая подпапка в Dir3)
│ filedf
| filefgh

└───Dir32
filebnmj

Отправлено: 18:15, 28-04-2021 | #8


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


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

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


Цитата Elven:
Исправить это и должно заработать. »
Так и подумал, заменил на нужное мне расширение - но ошибка выливалась все та-же, хотя в файлах более 6 символов.
Сейчас приеду домой и затестим еще раз, только уже на другой системе.
Отпишусь.

Отправлено: 18:27, 28-04-2021 | #9


Аватара для Elven

Ветеран


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

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


alpap, вроде как нужно
0. в каждой подпапке найти самый большой файл с определенным расширением
1. сравнить его имя с именем подпапки в которой он находится (первые шесть символов)
2. заархивировать все файлы с определенным расширением внутри подпапки и назвать архив именем файла с наибольшим размером, задав кастомное расширения какое-то там.

more_than_hater, не менее 6 символов должно быть не только у файлов, но и у подпапок в названии. Такую проверку я не добавлял, и так уже для того чтобы выполнить то, что делается в три строчки, наворочено...
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:00, 28-04-2021 | #10



Компьютерный форум 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




 
Переход