Показать полную графическую версию : Архивирование файлов определенного типа из подкаталогов
DJ Mogarych
29-04-2021, 13:32
Вываливается с ошибкой »
Исправил выше, пробуйте.
Старый вариант работал в PSv7, но в v5.1 почему-то нет.
Fors1k, как вы делаете подсветку кода здесь?
Параллельно изучаю скрипт Ув. Fors1k. Я так понял - у него происходит примерно то, что написал ранее. »
Да, с названием папки сравниваются все файлы.
Fors1k, как вы делаете подсветку кода здесь? »
Как-то раз было нечем заняться, и решил написать скрипт, который будет одним кликом подсвечивать синтаксис поша :)
more_than_hater
29-04-2021, 17:10
Исправил выше, пробуйте. »
Скрипт заработал. Можете подсказать, как решили проблему? Старый вариант скрипта не сохранил,потому провести сравнение не могу. Интересно.
Сделали четко по ТЗ, здесь вопросов нет.
В ходе тестирования скриптов Ув. Elven и Ув. Fors1k обнаружил проблему, что отборка по размеру файла - не всегда есть хорошо. Попадаются ситуации, когда самый крупный по размеру файл в подпапке - не является нужным. Ув. Fors1k использовал в своем скрипте метод отбора substring(0,4) - где 0 - с какого символа начинать сравнение и 4 - по какой символ включительно заканчивать сравнение. В сравнении учавствуют все файлы.
Т.к. знаний для написания своих команд мне на текущий момент нехватает (читать доки не перечитать) - попробовал использовать строку кода со скрипта Ув. Fors1k, модифицировав ваш, однако на выходе $name не применяется:
$dir = "C:\Users\admin\Documents\Raccoon\content\test_apps"
$ext = "*.apk"
dir "$dir" -Directory |? {[System.IO.Directory]::EnumerateFiles("$($_.fullname)", "$ext", "Alldirectories")} |% {
$name = (Get-ChildItem -Path $dir $ext|Where-Object{"$_".substring(0,4) -eq "$dir".substring(0,4)}).BaseName
$files |Compress-Archive -DestinationPath ($zip = "$dir\$((get-date).ToString("yyyy-MM-dd-hh-mm-ss"))-$name.zip")
Rename-Item "$zip" -NewName ($zip -replace "zip$","apps")
}
Пробовал запускать скрипт через отладку в ISE - ошибку не выводит. Можете разъяснить, почему все "так просто" не происходит? Вроде все переменные совпадают...
P.S.
Скрипт Ув. Elven закончил работу с 13 папками за 53,9 сек
Скрипт Ув. Fors1k закончил работу с 13 папками за 28,7 сек
Тоже хотелось бы понять, почему так происходит. Очень "грубо догадываясь" - в скрипте Ув. Elven красиво расписан переход от процедуре к процедуре, из за чего длинна кода увеличена, что способствует уменьшению скорости работы. В это же время, Ув. Fors1k решил не расписывать переходы и сделать код "все в одной строке", из-за чего разобраться в нем чуть сложнее, но работает в разы быстрее.
Может кто-то объяснить более внятно, почему такая разница в скорости?
Еще раз всем спасибо за потраченное время на проходящего мимо ламера.
more_than_hater, все гораздо проще - я в массиве два раза ковыряюсь :).
DJ Mogarych
29-04-2021, 17:48
закончил работу с 13 папками за »
А мой? :)
Можете подсказать, как решили проблему? »
Powershell 7 более догадлив, в частности, ему можно просто бросить объект каталога, и он сам поймёт, что нужно из него брать. В версии 5.1 нужно явно пихать полный путь.
То же и с расширением при упаковке. PS7 пофигу, какое расширение файла будет при упаковке, а PS5.1 ругается и требует, чтобы это обязательно было .zip, из-за этого пришлось дополнительно дописывать процедуру переименования.
разобраться в нем чуть сложнее »
Обычно редко кто хочет вникать в работу скрипта. Если вам интересно разобраться, то вот код по шагам:
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
А мой? »
А Ваш сравнить, к сожалению, не смог, т.к. у Вас отбор идет по весу файла. Отобрал эти самые 13 проблемных папок, и сравнивал уже на них скорость. Простите :) Честно пытался модифицировать сам, но не вышло...
Powershell 7 более догадлив »
А можно обновиться? Билд win10 pro последний, 7 в бета-тесте может?
Обычно редко кто хочет вникать в работу скрипта »
Не вникать было бы неуважительно по отношению к тем, кто писал этот скрипт. Да и, если честно, интересно научиться самому и писать и помогать другим (уже на опыте).
DJ Mogarych
30-04-2021, 09:05
PS7 ставится рядом, он не заменяет установленный PS5.1.
# Установить PS 7
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"
more_than_hater
27-05-2021, 15:14
Господа, приветствую еще раз.
Возникла потребность модифицировать скрипт написанный Вами ранее.
Каждая из папок может содержать как старые файлы, так и один единственный файл
Самый сложный случай:
Если в папке находится несколько файлов с разной датой (день) - то выбирать только самые новые файлы для дальнейшей работы с ними.
Если таких файлов несколько (день) - то архивировать их и все так-же переиминовывать архив в .xxx
Если такой файл один (день) - то не архивировать его, а просто копировать в ту же папку, где запускается текущий скрипт.
Т.е., нужно добавить проверку по дате (newest per day) и по кол-ву файлов внутри этой самой даты.
Заранее спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.