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 

Single Post  Topic: Распаковка и развертывание избыточной вложенности папок 
Author Message
helb



PostPosted: 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
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group