Страница 3 из 4
Добавлено: Вс фев 02, 2014 21:40
Cobblestone-TLT
Flasher
Что WinRAR будет создавать пустые папки я понял, это не страшно. Если организовать проверку скриптом размера папки сразу после распаковки не представляется возможным (и если он = 0 байт удалять её), что ж, буду делать это вручную (alt+shift+enter, упорядочить по размеру и т.д.). Что с висом и окном вопрос решаем - это уже хорошо. А как быть с поспешным удалением архивов из которых эти пустые папки получились?
Добавлено: Вс фев 02, 2014 21:54
Flasher
Код: Выделить всё
TOTALCMD#BAR#DATA
%ComSpec% /c for /f "delims=" %i in
('type %WL') do "%%COMMANDER_PATH%%\Utils\WinRAR\WinRAR.exe" x "%%i" -ibck -p- -inul "%P%%~ni" && del "%%i"
wcmicons.dll,31
Распаковать выбранные архивы c помощью WinRAR и удалить их при положительном результате
1
Cobblestone-TLT писал(а):Если организовать проверку скриптом размера папки сразу после распаковки не представляется возможным
Да возможно, только в кнопку не уложится, нужен пакетный файл либо скрипт.
Добавлено: Вс фев 02, 2014 22:55
Cobblestone-TLT
Flasher
Так и пусть будет скрипт, батник. Изначальный вариант как раз и есть связка (кнопка запускает батник, со скриптом в параметрах). Задачи уместить все это в кнопке и не ставится)
Posted after 6 minutes:
к слову о предложенной кнопке: я так понимаю раз нигде в параметрах нет ссылок ни на батник ни на скрипт, предполагается что она работает автономно (только укажи путь к WinRAR'у)? Так вот у меня результат почему-то - удаленные архивы и... ничего более! Или я как-то не правильно истолковал предложенный пример?
Добавлено: Вс фев 02, 2014 22:57
Flasher
Cobblestone-TLT
Да, кнопка работает автономно, иначе бы не писал об ограничениях. Скорее ошибка в пути к WinRAR (например, % не сдвоен).
А скрипт таков:
Код: Выделить всё
'======================================================
' Распаковать выбранные архивы в одноимённые папки
' с удалением распакованных архивов
' Параметры: %WL "<путь получателя>"
' Пример: %WL "%P"
'=================== Путь к WinRAR ====================
WinRAR = """%COMMANDER_PATH%\Utils\WinRAR\WinRAR.exe"""
'======================================================
With WScript.Arguments
If .Count = 0 Then WScript.Quit
List = .Item(0) : Path = .Item(1)
End With : If Right(Path, 1) <> "\" Then Path = Path & "\"
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("WScript.Shell")
Set Dict = CreateObject("Scripting.Dictionary")
For Each Ext in Split("ZIP RAR RAR5 7Z 7ZIP ACE ARJ BZ2 CAB GZ ISO JAR LZH TAR UUE")
Dict.Add Ext, ""
Next
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1,-1).ReadAll, vbNewLine)
If F <> "" And Dict.Exists(UCase(FSO.GetExtensionName(F))) Then
BN = Path & FSO.GetBaseName(F)
WSH.Run WinRAR & " x " & F & " -ibck -p- -inul """ & BN & "\""", 0, True
If FSO.FolderExists(BN) Then
If FSO.GetFolder(BN).Size = 0 Then FSO.DeleteFolder BN, 1 Else FSO.DeleteFile F, 1
End If
End If
Next : Set FSO = Nothing : Set WSH = Nothing : Set Dict = Nothing : WScript.Quit
Добавлено: Вс фев 02, 2014 23:19
Cobblestone-TLT
Flasher
В предпоследнем варианте, действительно пропустил один "%")
Что касается последнего, поведение такое - пустые папки от запароленного архива удаляются вместе с архивом, нешифрованные архивы распакуются как надо, но и сами архивы не удаляются.
Для полного счасться не хватает того, чтобы сами эти проблеммные архивы не удалялись вместе с пустой папкой, а не проблемные наоборот - удалялись. Возможно я не представляю масштаба сложности поставленной задачи, но на словах все формулируется (по моему сугубо личному мнению разумеется

) предельно просто: если размер папки на выходе = 0 - удалить её и оставить архив, если > 0 - наоборот (оставить папку и удалить архив).
Я не програмист, но что мне подсказывает что вот эта строка:
Код: Выделить всё
If FSO.GetFolder(BN).Size = 0 Then
FSO.DeleteFolder BN, 1 : FSO.DeleteFile F, 1
На "человеческом" языке звучит как:
"если размер папки = 0, то
удалить папку, удалить файл"
Возможно ли переписать проверку условия таким образом, чтобы это звучало так:
"если размер папки = 0, то
удалить папку;
иначе
удалить файл"
Простите, если изъясняюсь по-делитантски, просто я не программист и разбираюсь сейчас во всех этих кодах опираясь на знания, полученные еще в школе на уроках информатики

Добавлено: Вс фев 02, 2014 23:23
Flasher
Cobblestone-TLT писал(а):пустые папки от запароленного архива удаляются вместе с архивом, нешифрованные архивы распакуются как надо, но и сами архивы не удаляются.
Так это не моя затея:
Cobblestone-TLT писал(а):А как быть с поспешным удалением архивов из которых эти пустые папки получились?
Cobblestone-TLT писал(а):сами эти проблеммные архивы не удалялись вместе с пустой папкой, а не проблемные наоборот - удалялись
См. выше.
Что пишем, то и получаем. Сделал под обратные условия.
Добавлено: Вс фев 02, 2014 23:28
Cobblestone-TLT
Выдает ошибку на строке 26, символ 4
Добавлено: Вс фев 02, 2014 23:30
Flasher
Упс. End If лишний не убрал. Сделано.
P.S. Также обращаю внимание, что файлы с неподдерживаемыми расширениями будут игнорироваться (можно смело выделять случайные).
Добавлено: Вс фев 02, 2014 23:32
Cobblestone-TLT
Первым делом решил, что дело в этом, пробовал убрать сам

Теперь ошибки не выдает, но и результата никакого. Я имею в виду совсем никакого - все архивы на месте, папок не создается.
Добавлено: Вс фев 02, 2014 23:35
Flasher
Cobblestone-TLT
Опять с путём WinRAR накосячено?

Либо выделяются только запароленные архивы.
+ Забыл ZIP-ы прописать (уже добавил). Не они?
Добавлено: Вс фев 02, 2014 23:40
Cobblestone-TLT
Для проверки создано 3 архива:
1-no_pass
2-pass
3-no_pass2
Путь к рару вставляю копипастом (перепроверил правильность трижды). Вы у себя на живом примере тоже проверяли, все работает? (просто допускаю возможность, что "пишите музыку по нотам, а не на слух"

)
p.s. за фильтр по расширениям спасибо - штука нужная, теперь не обязательно "отсеивать" архивы от сопровождающих файлов описаний и прочих заметок
Posted after 2 minutes:
Они родимые! Они!!!

Спасибо огромное! Премного благодарен! То, что нужно. Отрабатывает на УРА!
Добавлено: Пн фев 03, 2014 00:11
Flasher
Хорошо. Пож-та.
Если потребуется, могу потом и
этот скрипт допились, у 7-zip всяко форматов больше.
P.S.: Кнопку тоже поправил.
Добавлено: Пн фев 03, 2014 08:57
Cobblestone-TLT
Flasher
Во вложенных каталогах распаковка мне лично пока не требуется, достаточно обработки списка выделенных архивов, но если переделаете имеющийся в этой теме скрипт для работы с 7zip вместо WinRAR (ввиду его бОльшей "всеядности") без изменения функционала - будет приятно
Пока вроде с "экзотическими" форматами дел иметь не приходится, но мало ли как оно обернется в будущем, а чем универсальней используемый инструмент - тем, по моему, лучше
p.s. острой необходимости пока нет, но за темой слежу, если появится время и желание переделать - с радостью заберу исправленный вариант. А пока и на том огромное спасибо!
Добавлено: Пн фев 03, 2014 20:54
Flasher
Cobblestone-TLT
Может, кто-то хочет с WinRAR работать. Оставлю и тот вариант.
[cut="Decompress_selected_archives.vbs"]
Код: Выделить всё
'=========================================================
' Распаковка выбранных архивов в одноимённые папки
' с возможностью удаления правильно распакованных архивов
' Параметры: %WL "<путь получателя>" <флаг удаления: 1>
' Пример: %WL "%P" 1
'====================== Путь к 7-zip =====================
Z7 = """%COMMANDER_PATH%\Utils\7-Zip\7z.exe"""
'=========================================================
With WScript.Arguments
C = .Count : If .Count = 0 Then WScript.Quit
List = .Item(0) : Path = .Item(1) : If C = 3 Then Del = .Item(2)
End With : If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim WSH : Set WSH = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Const M = 0 : Set Dict = CreateObject("Scripting.Dictionary")
Exts = "zip 7z 7zip arj bz2 bzip2 cab chm chw cpio cramfs deb dmg doc" &_
" exe fat gz gzip hfs hxs iso lha lzma mbr msi ntfs ppt rar rpm scap " &_
"squashfs swm tar taz tbz tbz2 tgz vhd wim xar xls xz"
For Each Ext in Split(Exts) : Dict.Add Ext, "" : Next
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1,-1).ReadAll, vbNewLine)
If F <> "" And Dict.Exists(LCase(FSO.GetExtensionName(F))) Then
BN = Path & FSO.GetBaseName(F) : NN = BN : n = 0
Do While FSO.FolderExists(NN)
n = n + 1
If n < 10^M Then PFix = Right(String(M, "0") & n, M) Else PFix = n
NN = BN & " (" & PFix & ")"
Loop : WSH.Run Z7 & " x """ & F & """ -o""" & NN & "\"" -y -p", 0, True
If FSO.FolderExists(NN) Then
If FSO.GetFolder(NN).Size Then
If Del = 1 Then FSO.DeleteFile F, 1
Else FSO.DeleteFolder NN, 1
End If
End If
End If
Next : Set FSO = Nothing : Set WSH = Nothing : Set Dict = Nothing : WScript.Quit
[/cut]В этот скрипт ещё добавил автосмену потенциального имени папки, если папка с тем же именем уже существует.
Добавлено: Пн фев 03, 2014 22:13
Cobblestone-TLT
Flasher
Решил протестировать предложенный вариант и обнаружил следущее, скрипт(7-Zip) удаляет запароленные архивы, оставляя вместо них папку с файлами-пустышками. Кроме того попробовал еще раз на тех же архивах скрипт(WinRAR), так вот он на созданном мной для теста архиве с паролем выдает сообщение об ошибке в строке 24, символ 6 (Путь не найден). Не пойму в чем дело, вчера вроде с подобным же архивом работал как надо

Если допилите 7-Zip чтобы не удалял нераспакованные архивы потестирую более тщательно.
p.s. проблемный архив "zip", создан встроенным архиватором TC8.5RC2, обычным способом распаковывается прекрасно, при обработке скриптом - ошибка.
p.p.s. создал из тех же файлов с тем же паролем rar архив WinRAR'ом - скрипт отрабатывает как надо, если аналогичный архив создать WinRAR'ом в формате - та же ошибка возвращается.
Posted after 2 minutes:
Создал еще несколько архивов с произвольным содержимым - все шифрованные архивы zip почему-то вызывают указанную ошибку
