Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Распаковка и развертывание избыточной вложенности папок

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
helb



Joined: 08 Oct 2014
Posts: 57

Post (Separately) Posted: Mon Nov 03, 2014 20:33    Post subject: Распаковка и развертывание избыточной вложенности папок Reply with quote

Требовалось решение проблемы с распаковкой вслепую (Alt+F9), когда неизвестно, что в корне архива и можно получить или избыточные вложенные директории или кучу файлов скопом, где не нужно, а также развертывание само по себе.
Скрипт в одно нажатие:
1) Файлы отдает 7zip'у на распаковку в папку с именем архива и применяет к образовавшимся папкам второе;
2) Папки развертывает по принципу: если внутри всего один объект, перемещать на уровень вверх и удалять пустую (своего рода Flatten directories)
По окончании, если потребовались действия, выдает информацию о перемещенных объектах и/или конфликтах. Я повесил на F9 и использую с 7zG.exe (отображает прогресс)

unpack-unfold.vbs:
Code:

'============================================================
' Распаковка и развертывание избыточной вложенности папок (by helb)
' Указанные в списке: архивы — распаковывает в одноимённые папки с развертыванием, папки — развертывает (пустые удаляет)
' Параметры: <listfile> ["<path>"] (если путь не указан, распаковывает в место нахождения архива)
' TC: %WL "%P"
'====================== Путь к 7z/7zG =======================
tool = "B:\Progs\Archivers\7-Zip\7zG.exe"
'============================================================
with WScript.Arguments
   if .Count = 0 then WScript.Quit
   List = .Item(0)
   if .Count > 1 then Path = .Item(1) else Path = ""
end with
if Right(Path, 1) <> "\" and Path <> "" then Path = Path & "\"
set FSO = CreateObject("Scripting.FileSystemObject")
set sh = CreateObject("WScript.Shell")
conflicts = "" : unfolded = 0

for each F in Split(FSO.OpenTextFile(List, 1, false, -1).ReadAll, vbNewLine)
   if objExists(F) > 0 then
      if FSO.FileExists(F) then 'archive(file)
         if Path <> "" then BN = Path else BN = FSO.GetParentFolderName(F) & "\"
         BN = BN & FSO.GetBaseName(F) : NN = BN : n = 0
         do while FSO.FolderExists(NN)
            n = n + 1
            NN = BN & " (" & n & ")"
         loop
         sh.Run tool & " x """ & F & """ -o""" & NN & "\"" -y", 8, true
      else 'folder
         NN = F
         if Right(NN, 1) = "\" then NN = Left(NN, Len(NN)-1)
      end if
      if FSO.FolderExists(NN) then
         cnt = (FSO.GetFolder(NN).Files).Count + (FSO.GetFolder(NN).SubFolders).Count
         if cnt = 1 then
            set fObjs = FSO.GetFolder(NN).Files
            if fObjs.Count = 0 then set fObjs = FSO.GetFolder(NN).SubFolders
            for each fObj in fObjs
               targetPath = fObj.ParentFolder.ParentFolder & "\"
               if fObj.Name = fObj.ParentFolder.Name then
                  set parent = FSO.GetFolder(fObj.ParentFolder)
                  FSO.CreateFolder(targetPath & "DCF8E1E9-F66B-4C95-A4E7-47B9591DADBA")
                  fObj.Move(targetPath & "DCF8E1E9-F66B-4C95-A4E7-47B9591DADBA\")
                  parent.Move(targetPath & "DCF8E1E9-F66B-4C95-A4E7-47B9591DADBA_t")
                  fObj.Move(targetPath)
                  FSO.DeleteFolder targetPath & "DCF8E1E9-F66B-4C95-A4E7-47B9591DADBA", true
                  parent.Delete(true)
                  unfolded = unfolded + 1
               elseif objExists(targetPath & fObj.Name) > 0 then
                  conflicts = conflicts & fObj.Name & vbNewLine
               else
                  fObj.Move(targetPath)
                  FSO.DeleteFolder NN, true
                  unfolded = unfolded + 1
               end if
            next
         elseif cnt = 0 then
            FSO.DeleteFolder NN, true
            unfolded = unfolded + 1
         end if
      end if
   end if
next
if conflicts <> "" or unfolded > 0 then WScript.Echo("Unfolded: " & unfolded & vbNewLine & "Conflicts: " & vbNewLine & conflicts)

'0=not exists, 1=is file, 2=is folder
function objExists(name)
   if FSO.FileExists(name) then
      objExists = 1
   elseif FSO.FolderExists(name) then
      objExists = 2
   else
      objExists = 0
   end if
end function
Back to top
View user's profile Send private message
Nick



Joined: 26 Dec 2014
Posts: 107

Post (Separately) Posted: Fri Dec 26, 2014 20:47    Post subject: Reply with quote

Выходит с ошибкой

Строка: 28
Символ 11
Ошибка: Не удается найти указанный файл
...
Источник: (null)


TC 8.51a x64
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Dec 26, 2014 21:15    Post subject: Reply with quote

Nick
Сперва вопрос - какая задача поставлена?
Я могу предложить (по аналогии с этим)
 вариант оптимальнее:

_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Nick



Joined: 26 Dec 2014
Posts: 107

Post (Separately) Posted: Mon Dec 29, 2014 16:36    Post subject: Reply with quote

Flasher wrote:
Nick
Сперва вопрос - какая задача поставлена?


Распаковать все выделенные архивы через WinRAR в активную панель.
Каждый архив должен распаковываться в отдельную папку (с именами архивов).

Опционально:
Если в начальной папке, подпапка и родительская папка – одинаковые, то оставить одну. (Например: «Новая папка\Новая папка\file.txt», то оставить только одну («Новая папка\file.txt)).
ИЛИ
Опционально:
Если архив уже содержит внутри такое же название папки как и самого архива, то применить распаковку в текущую папку, если нет – распаковать в папку с именем архива. Т.е. какая-то проверка еще до разархивирования.
(Но этот вариант, наверно сложнее и возможно дольше будет выполняться.)
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Dec 29, 2014 16:42    Post subject: Reply with quote

Nick
Так и думал, что только архивов касается. Тогда в тему по приведённой ссылке и переносимся.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group