Показать полную графическую версию : Архивирование файлов определенного типа из подкаталогов
more_than_hater
28-04-2021, 12:42
Добрый день.
Прошу помощи с написанием скрипта для решения такой задачи:
Вводные
Имеем множество папок, в каждой из которых есть файлы с различными расширениями и размерами соответственно.
Основная_папка\Подпапка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
Заранее спасибо.
наибольшего веса каждой отдельной подпапки »
интересно
но ведь вес .\Dir1\Dir11
входит в состав веса .\Dir1
когда мы будем искать наибольший это будут естественно корни
1. Архив должен содержать только файлы определенного расширения ".ххх". »
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
more_than_hater
28-04-2021, 16:27
т.е. архивируем, например, *.docx а архив называем *.jpg?
со вторым пунктом тоже как-то не всё понятно. Их таки вместе заархивировать или каждый по отдельности? »
1. Именно так
2. Каждый по отдельности. Дополнительный пример (в живую) под спойлером.
https://puu.sh/HCaE2.png
интересно
но ведь вес .\Dir1\Dir11
входит в состав веса .\Dir1
когда мы будем искать наибольший это будут естественно корни »
Добавляем строку и под pushd считываем файлы только внутри одной папки, где далее делаем выборку. Далее "FOR" производит loop и считывает следующую папку применяя все команды в DO ()
Пример реализации под спойлером.
https://puu.sh/HCbWp.png
Тут осталось только сделать сортировку по весу файла с последующей выборкой имени у самого крупного файла в папке.
Немного усложняем задачу на 1 шаг вперед. Именовать архив нужно используя не fullname файла наибольшего по весу. Как именно нужно:
1. Узнаем fullname файла наибольшего по весу
2. Сравниваем найденый fullname с названием "Подпапки" (первых 6 символов будет достаточно) %var:~0,6%%"=="var2", где var - имя файла, а var2 - имя подпапки, в которой находятся файлы. Тот файл, который проходит проверку - является положительным результатом.
Сравнивать, например, можно так: %var:~0,7%%"==%var2
3. Применяем название архива, как "..\%%F.apps", где %%F=var
Пока писал, чуть сам не запутался... А может запутался...
Прописать это все на деле не хватает опыта. Надеюсь на вашу помощь :)
А нафига тогда размер файла подтягивать? я уже вообще ничего не розумею. короче вот:
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 "Не совпадают в $_"
}
}
more_than_hater
28-04-2021, 17:48
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
Что-то ему не нравится...
А нафига тогда размер файла подтягивать? »
Чтобы знать, с каким файлом проводить сравнение имени. Можно конечно сравнить со всеми файлами в папке, тут на вкус и цвет уже...
Конечно будет ругаться. Не может он удалить символы ПОСЛЕ шестого, если символов МЕНЬШЕ 6 (можно выбрать число поменьше).
Далее, скрипт немного таки поменять нужно было (у меня не было пачки apk чтобы потестить на них, за то у меня было много файлов с другим расширением, которые разумеется не находятся у вас, за полным отсутствия присутствия оных).
Get-ChildItem $_/*.ps1
например вот здесь.
Исправить это и должно заработать.
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
more_than_hater
28-04-2021, 18:27
Исправить это и должно заработать. »
Так и подумал, заменил на нужное мне расширение - но ошибка выливалась все та-же, хотя в файлах более 6 символов.
Сейчас приеду домой и затестим еще раз, только уже на другой системе.
Отпишусь.
alpap, вроде как нужно
0. в каждой подпапке найти самый большой файл с определенным расширением
1. сравнить его имя с именем подпапки в которой он находится (первые шесть символов)
2. заархивировать все файлы с определенным расширением внутри подпапки и назвать архив именем файла с наибольшим размером, задав кастомное расширения какое-то там.
more_than_hater, не менее 6 символов должно быть не только у файлов, но и у подпапок в названии. Такую проверку я не добавлял, и так уже для того чтобы выполнить то, что делается в три строчки, наворочено...
more_than_hater
28-04-2021, 20:33
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
Структура основной папки и пример подпапки (во всех подпапках примерно также):
https://puu.sh/HCfyZ.png
надо было сразу так сделать...
$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 куда-нибудь сюда.
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, ну а как это обычно получается? Дернул один раз - ради этого в переменную загонять как-то... зачем? после этого заметил что еще раз нужно. Потом переписал скрипт еще три раза и забил на это :)
more_than_hater
29-04-2021, 09:10
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.
и если снова не запустится - вывод »
Тут мой косяк. Запускал через PowerShell ISE, но не перешел в директорию, где нужно применять скрипт. Все ноги росли отсюда. И да, обрезку во втором случае также проглядет. Ламер - что сказать.
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
}
}
more_than_hater
29-04-2021, 11:05
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. Я так понял - у него происходит примерно то, что написал ранее.
https://puu.sh/HCqTj.png
P.S. Код Ув.Fors1k также работает отлично, спасибо!
DJ Mogarych
29-04-2021, 11:57
Ещё вариант
$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")
}
more_than_hater
29-04-2021, 13:15
»Ещё вариант
$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
использование 7z »
А зачем? Не, ну если бы там использовался например winrar - ладно, мало ли внезапно не захотелось лицензию на оный покупать. Но архивация средствами powershell чем плоха, если есть из коробки (и в отличие от 7z не требует установки)? Теоретически можно, но ни винды ни 7z под рукой (даже хз есть ли он под линух) нет, посему конкретнее не подскажу. Скорей всего придется скармливать ему массив полученных фулнеймов *.apk.
идет отборка по размеру файла »
А нафига тогда размер файла подтягивать? »
:happy:
$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
}
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.