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

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

 

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


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

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


Elven,
Подправил расширения и уменьшил кол-во символов для удаления до 4-х.
Скрытый текст

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


Выдаваемая ошибка:
Скрытый текст

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


Структура основной папки и пример подпапки (во всех подпапках примерно также):
Скрытый текст



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



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

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


Аватара для Elven

Ветеран


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

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


надо было сразу так сделать...
Код: Выделить весь код
$mask = "*.apk"
$count = 4

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

Отправлено: 21:53, 28-04-2021 | #12


Аватара для Fors1k

Старожил


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

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


Elven, зачем выполнять 3 раза подряд команду Get-ChildItem $_/$mask?
Код: Выделить весь код
$ext  = "*.apk"

ForEach($dir in gci -Directory){
    $n = (Get-ChildItem -Path $dir $ext|Where-Object{"$_".substring(0,4) -eq "$dir".substring(0,4)}).BaseName
    if($n -and !(Test-Path "$n.apps")){Compress-Archive $dir\$ext "$n.zip" -c Fastest;ren "$n.zip" "$n.apps"}
} 

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

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

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


Аватара для Elven

Ветеран


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

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


Fors1k, ну а как это обычно получается? Дернул один раз - ради этого в переменную загонять как-то... зачем? после этого заметил что еще раз нужно. Потом переписал скрипт еще три раза и забил на это

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


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


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

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


Elven, скрипт отлично работает, но есть две проблемки.
1. При замене .zip на .yyy - как я понял из поста Fors1k, можно дообавить команду ren для последующего переименования. Тут ок.
Скрытый текст

Код: Выделить весь код
Compress-Archive : .apps — неподдерживаемый формат файла архива. .zip — единственный поддерживаемый формат файла архи
ва.
C:\Users\admin\Documents\Raccoon\content\apps\test3.ps1:8 знак:45
+ ... _/$mask).FullName | Compress-Archive -DestinationPath ./$archive_name
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (.apps:String) [Compress-Archive], IOException
    + FullyQualifiedErrorId : NotSupportedArchiveFileExtension,Compress-Archive

2. В некоторых случаях (папка-файл), нужно отрезать более 11 символов, но не все (папка-файл) имеют такую длинну.
Скрытый текст

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


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

P.S.
Цитата Elven:
и если снова не запустится - вывод »
Тут мой косяк. Запускал через PowerShell ISE, но не перешел в директорию, где нужно применять скрипт. Все ноги росли отсюда. И да, обрезку во втором случае также проглядет. Ламер - что сказать.

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


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


Аватара для Elven

Ветеран


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

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


1. линуксовый posh не такой капризный - жрет что дали . значит нужно сначала в зип, а потом переименовывать (см. ниже)
2. не проще тогда искать название папки в названии файла (опять же см. ниже)?
Код: Выделить весь код
$aext = "*.ps1"
$rext = ".yyy"

Get-ChildItem -Directory | ForEach-Object {
  $archive_name = (Get-ChildItem $_/$mask | Sort-Object -Property Length -descending | select -First 1).BaseName
  if ($archive_name -match $_.name) {
    if (!(Test-Path "$archive_name*" -PathType Leaf)) {
      (Get-ChildItem $_/$mask).FullName | Compress-Archive -DestinationPath ./$archive_name.zip
      Rename-Item "$archive_name.zip" "$archive_name$rext"
    } else {
      Write-Host "Уже есть такой файл: $archive_name "
    }
  } else {
    Write-Host "Не совпадают имена"
    Write-Host $archive_name != $_.Name
  }
}

Последний раз редактировалось Elven, 29-04-2021 в 10:05.

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

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


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


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

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


Elven , Отлично работает, спасибо!
1. Дополнительный вопрос. Можем ли модернизировать скрипт на использование 7z? Конкретно сейчас нужды в этом нет, но в будущем...
Попытался внести правки в код:
Скрытый текст

Код: Выделить весь код
$mask = "*.apk"
$rext = ".yyy"
$env = "C:/Program Files/7-Zip"

Get-ChildItem -Directory | ForEach-Object {
  $archive_name = (Get-ChildItem $_/$mask | Sort-Object -Property Length -descending | select -First 1).BaseName
  if ($archive_name -match $_.name) {
    if (!(Test-Path "$archive_name*" -PathType Leaf)) {
      (Get-ChildItem $_/$mask).FullName | Start-Process -FilePath "$env/7zG.exe" -a -tzip "./$archive_name$rext"
    } else {
      Write-Host "Уже есть такой файл: $archive_name "
    }
  } else {
    Write-Host "Не совпадают имена"
    Write-Host $archive_name != $_.Name
  }
}


Но правки встречают меня ошибкой:
Скрытый текст

Код: Выделить весь код
Start-Process : Не удается найти позиционный параметр, принимающий аргумент "./air.au.com.metro.DumbWaysToDie2-500001
1.yyy".
C:\Users\admin\Documents\Raccoon\content\apps\compress_apps_7z.ps1:9 знак:43
+ ... .FullName | Start-Process -FilePath "$env/7zG.exe" -a -tzip "./$archi ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand


Подскажите, как правильно внести правку?

2. В продолжение смежной темы "сравнение названий"
Т.к. у нас в скрипте все-еще идет отборка по размеру файла - попадаются ситуации, когда самый крупный по размеру файл в подпапке - не является нужным. Можем отказаться от сравнения с самым крупным файлом в подпапке и сравнивать имя каждого файла в подпапке с именем самой подпапки? Параллельно изучаю скрипт Ув. Fors1k. Я так понял - у него происходит примерно то, что написал ранее.
Скрытый текст




P.S. Код Ув.Fors1k также работает отлично, спасибо!

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


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


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

fascinating rhythm


Moderator


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

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


Ещё вариант
Код: Выделить весь код
$dir = "D:\temp"
$ext = "*.txt"

dir "$dir" -Directory |? {[System.IO.Directory]::EnumerateFiles("$($_.fullname)", "$ext", "Alldirectories")} |% {
$name = (dir "$($_.fullname)" -Include "$ext" -File -Recurse -OutVariable files |sort length |select -Last 1).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$","yyy")
}

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


Последний раз редактировалось DJ Mogarych, 29-04-2021 в 13:31. Причина: исправил для v5

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

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


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


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

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


Цитата DJ Mogarych:
»Ещё вариант
Скрытый текст

Код: Выделить весь код
$dir = "D:\temp"
$ext = "*.txt"
dir "$dir" -Directory |? {[System.IO.Directory]::EnumerateFiles("$_", "$ext", "Alldirectories")} |% {
$name = (dir $_ -Include "$ext" -File -Recurse -OutVariable files |sort length |select -Last 1).BaseName
$files |Compress-Archive -DestinationPath "$dir\$((get-date).ToString("yyyy-MM-dd-hh-mm-ss"))-$name.yyy"
}
Вываливается с ошибкой. Почему-то System.IO.Direcrory, монтируется в корне папки пользвателя? А может это так и надо, но суть в том, что основная папка находится не там - от того и ошибка. Попробовал заменить System.IO.Directory на $dir - в таком случае не работает продолжение команды (это все единое целое, как я понял).
Скрытый текст

Код: Выделить весь код
Исключение при вызове "EnumerateFiles" с "3" аргументами: "Не удалось найти часть пути "C:\Users\admin\com.adobe.read
er"."
C:\Users\admin\Documents\Raccoon\content\test_apps\test.ps1:4 знак:27
+ ... rectory |? {[System.IO.Directory]::EnumerateFiles("$_", "$ext", "Alld ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DirectoryNotFoundException

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


Аватара для Elven

Ветеран


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

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


Цитата more_than_hater:
использование 7z »
А зачем? Не, ну если бы там использовался например winrar - ладно, мало ли внезапно не захотелось лицензию на оный покупать. Но архивация средствами powershell чем плоха, если есть из коробки (и в отличие от 7z не требует установки)? Теоретически можно, но ни винды ни 7z под рукой (даже хз есть ли он под линух) нет, посему конкретнее не подскажу. Скорей всего придется скармливать ему массив полученных фулнеймов *.apk.
Цитата more_than_hater:
идет отборка по размеру файла »
Цитата Elven:
А нафига тогда размер файла подтягивать? »

Код: Выделить весь код
$aext = "*.xxx"
$rext = ".yyy"

Get-ChildItem -Directory | ForEach-Object {
  $fnames = (Get-ChildItem $_/$mask).BaseName
  if ($fnames -match $_.name) {
    $tf = $_.Name
    $fnames.ForEach{
      if ($PSItem -match $tf) {
        $archive_name = $PSItem
      }
    }
    if (!(Test-Path "$archive_name*" -PathType Leaf)) {
      (Get-ChildItem $_/$mask).FullName | Compress-Archive -DestinationPath ./$archive_name.zip
      Rename-Item "$archive_name.zip" "$archive_name$rext"
    } else {
      Write-Host "Уже есть такой файл: $archive_name "
    }
  } else {
    Write-Host "Не совпадают имена"
    Write-Host $archive_name != $_.Name
  }
}
Это сообщение посчитали полезным следующие участники:

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



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




 
Переход