Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Архивирование файлов определенного типа из подкаталогов (http://forum.oszone.net/showthread.php?t=348641)

more_than_hater 28-04-2021 12:42 2956557

Архивирование файлов определенного типа из подкаталогов
 
Добрый день.

Прошу помощи с написанием скрипта для решения такой задачи:
Вводные
Имеем множество папок, в каждой из которых есть файлы с различными расширениями и размерами соответственно.
  • Основная_папка\Подпапка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

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

alpap 28-04-2021 13:49 2956565

Цитата:

Цитата more_than_hater
наибольшего веса каждой отдельной подпапки »

интересно
но ведь вес .\Dir1\Dir11
входит в состав веса .\Dir1
когда мы будем искать наибольший это будут естественно корни

Elven 28-04-2021 13:54 2956567

Цитата:

Цитата 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


more_than_hater 28-04-2021 16:27 2956587

Цитата:

Цитата 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

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

Elven 28-04-2021 17:14 2956595

А нафига тогда размер файла подтягивать? я уже вообще ничего не розумею. короче вот:
Код:

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 2956597

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
А нафига тогда размер файла подтягивать? »

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

Elven 28-04-2021 18:11 2956598

Конечно будет ругаться. Не может он удалить символы ПОСЛЕ шестого, если символов МЕНЬШЕ 6 (можно выбрать число поменьше).
Далее, скрипт немного таки поменять нужно было (у меня не было пачки apk чтобы потестить на них, за то у меня было много файлов с другим расширением, которые разумеется не находятся у вас, за полным отсутствия присутствия оных).
Код:

Get-ChildItem $_/*.ps1
например вот здесь.
Исправить это и должно заработать.

alpap 28-04-2021 18:15 2956599

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 2956600

Цитата:

Цитата Elven
Исправить это и должно заработать. »

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

Elven 28-04-2021 19:00 2956601

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

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

more_than_hater 28-04-2021 20:33 2956611

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



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



Elven 28-04-2021 21:53 2956612

надо было сразу так сделать...
Код:

$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
куда-нибудь сюда.

Fors1k 29-04-2021 01:49 2956625

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"}
}


Elven 29-04-2021 08:05 2956631

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

more_than_hater 29-04-2021 09:10 2956635

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, но не перешел в директорию, где нужно применять скрипт. Все ноги росли отсюда. И да, обрезку во втором случае также проглядет. Ламер - что сказать.

Elven 29-04-2021 10:00 2956637

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 2956643

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 также работает отлично, спасибо!

DJ Mogarych 29-04-2021 11:57 2956648

Ещё вариант
Код:

$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 2956658

Цитата:

Цитата 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


Elven 29-04-2021 13:20 2956660

Цитата:

Цитата more_than_hater
использование 7z »

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

Цитата more_than_hater
идет отборка по размеру файла »

Цитата:

Цитата Elven
А нафига тогда размер файла подтягивать? »

: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
  }
}


DJ Mogarych 29-04-2021 13:32 2956666

Цитата:

Цитата more_than_hater
Вываливается с ошибкой »

Исправил выше, пробуйте.
Старый вариант работал в PSv7, но в v5.1 почему-то нет.

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

Fors1k 29-04-2021 14:25 2956671

Цитата:

Цитата more_than_hater
Параллельно изучаю скрипт Ув. Fors1k. Я так понял - у него происходит примерно то, что написал ранее. »

Да, с названием папки сравниваются все файлы.
Цитата:

Цитата DJ Mogarych
Fors1k, как вы делаете подсветку кода здесь? »

Как-то раз было нечем заняться, и решил написать скрипт, который будет одним кликом подсвечивать синтаксис поша :)

more_than_hater 29-04-2021 17:10 2956693

Цитата:

Цитата 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 решил не расписывать переходы и сделать код "все в одной строке", из-за чего разобраться в нем чуть сложнее, но работает в разы быстрее.

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

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

Elven 29-04-2021 17:25 2956694

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

DJ Mogarych 29-04-2021 17:48 2956697

Цитата:

Цитата more_than_hater
закончил работу с 13 папками за »

А мой? :)
Цитата:

Цитата more_than_hater
Можете подсказать, как решили проблему? »

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

Fors1k 29-04-2021 18:32 2956703

Цитата:

Цитата 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 -только файлы.

more_than_hater 29-04-2021 20:47 2956711

Цитата:

Цитата DJ Mogarych
А мой? »

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

Цитата:

Цитата DJ Mogarych
Powershell 7 более догадлив »

А можно обновиться? Билд win10 pro последний, 7 в бета-тесте может?

Цитата:

Цитата Fors1k
Обычно редко кто хочет вникать в работу скрипта »

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

DJ Mogarych 30-04-2021 09:05 2956748

PS7 ставится рядом, он не заменяет установленный PS5.1.
Код:

# Установить PS 7
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"


more_than_hater 27-05-2021 15:14 2959047

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

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

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


Время: 09:10.

Время: 09:10.
© OSzone.net 2001-