helb
|
Posted: Mon Nov 03, 2014 20:33 Post subject: Распаковка и развертывание избыточной вложенности папок |
|
|
Требовалось решение проблемы с распаковкой вслепую (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
|
|
|