Triki z PowerShellem #12 – Rozpakowywanie

2009-12-07 23:18

Powtarzające się katalogiWiele programów z sieci wciąż jeszcze ściąga się w postaci archiwów do samodzielnego wypakowania, jak choćby w formacie .zip. Ma to swoje zalety i wady – do tych drugich należy fakt, że nie bardzo wiadomo, jak wygląda wewnętrzna struktura katalogów takiej paczki. Używając opcji typu Wypakuj tutaj ryzykujemy zaśmiecenie folderu Downloads plikami programu. Dlatego osobiście zawsze stosuję polecenie Wypakuj do nowego katalogu.
I tu czasem jest mały zonk, gdy twórca archiwum zdecydował się na spakowanie całego folderu, a nie tylko zawartych w nim plików. Powstają wtedy nadmiarowe katalogi, wydłużające ścieżki do plików (co widać obok – w wersji trochę przesadzonej ;)).

Ponieważ podobne sytuacje zdarzają mi się dość często, postanowiłem im zaradzić przy pomocy najlepszego narzędzia na takie okazje, czyli PowerShella rzecz jasna :) Wynikiem jest poniższy skrypt do sprytniejszego rozpakowywania archiwów:

  1. # unpack.ps1
  2. # Sprytne rozpakowywanie archiwów
  3. param ([string]$archive = $(throw "No archive specified"))
  4.  
  5. # Bierzemy nazwę archiwum i tworzymy odpowiadający mu katalog
  6. $name = [IO.Path]::GetFileNameWithoutExtension($archive)
  7. Set-Location -Path (New-Object IO.FileInfo @($name)).DirectoryName
  8. $dir = [IO.Directory]::CreateDirectory($name)
  9.  
  10. # Rozpakowujemy archiwum do tego katalogu
  11. $shell = New-Object -ComObject Shell.Application
  12. $src = $shell.Namespace($archive)
  13. $dest = $shell.Namespace($name)
  14. $dest.CopyHere($src.items())
  15.  
  16. # Rekurencyjnie badamy zawartość rozpakowanego archiwum
  17. while (($items = $dir.GetFileSystemInfos()) -eq 1)
  18. {
  19.     # Sprawdzamy, czy jego pierwszy i jedyny element jest katalogiem
  20.     $fsi = $items[0]
  21.     if (($fsi.Attributes -band [IO.FileAttributes]::Directory) -eq 0)
  22.         { break }
  23.    
  24.     # Jest - dokonujemy skrócenia ścieżki
  25.     $fsi.MoveTo([IO.Path]::GetRandomFileName())
  26.     $dir.Delete()
  27.     $dir = $fsi
  28.     $dir.MoveTo($name)
  29. }

Jego działanie polega wpierw na zwykłej dekompresji archiwum. Jak można zauważyć, używa do tego obiektu COM-owskiego Shell.Application. To sprawia, że skrypt ma pod tym względem te same możliwości co zwykły windowsowy Eksplorator (dla większych plików pokaże nawet pasek postępu ;]).
Później wypakowana zawartość jest poddawana operacji, którą nazywam tutaj ‘skróceniem ścieżki’. Polega ona wyrzuceniu jednego poziomu drzewa folderów, o ile tylko pewien katalog jest jedynym elementem swojego katalogu nadrzędnego. Takie właśnie sytuacje powstają przy dekompresji do nowego folderu archiwów źle zapakowanych (przynajmniej z mojego punktu widzenia ;P). Wynikiem działania skryptu będzie więc w sumie jeden nowy podkatalog zawierający bezpośrednio całą interesującą zawartość archiwum.

Oczywiście używanie powyższego skryptu tylko z poziomu linii komend PowerShella nie jest specjalnie wygodne; lepiej jest dodać go do menu kontekstowego archiwów, czyli np. plików .. O tym, jak można tego dokonać, napisałem dość obszernie przy okazji prezentacji skryptu do wysyłania przez FTP.

Be Sociable, Share!
Be Sociable, Share!
Tags: , ,
Author: Xion, posted under Applications, Internet, Programming »


5 comments for post “Triki z PowerShellem #12 – Rozpakowywanie”.
  1. vashpan:
    December 8th, 2009 o 10:59

    Taki Total Commander ma ta fajna wlasciwosc ( jedna z wielu ;) ) ze pozwala na przegladanie praktycznie kazdego archiwum podobnie jak katalogi, i tak samo jak z nich, pozwala kopiowac dowolnie zaznaczona zawartosc z archiwum. Mimo ze Explorer z Win7 jest juz znacznie lepszy niz nieuzywalne w wiekszym wymiarze praktycznie dla mnie jego wczesniejsze wersje, ale po pewnym czasie i tak wrocilem do starego sprawdzonego TCMD… :)

  2. Xion:
    December 8th, 2009 o 12:47

    Już stary dobry Norton Commander miał coś takiego :)

  3. vashpan:
    December 8th, 2009 o 14:09

    A nowy pachnacy Explorer z Windows 7 nie ma ;p

    Ale szczerze to nie pamietam zeby NC mial taka opcje… Przynajmniej nie DOS’owa (byly inne?) wersja ktora namietnie uzywalem w czasach przed win95 :)

    W kazdym razie, dzieki za skrypcik… PowerShell jest swietny ideowo, pewien przelom w mysleniu o interfejsach tekstowych, ale mnie jak narazie odrzuca z paru wzgledow. Glowny to taki ze kto widzial zeby powloka tekstowa odpalala sie 5 sekund… :)

  4. Xion:
    December 8th, 2009 o 16:20

    Eksplorator potrafi przeglądać archiwa jak foldery chyba od Visty (rozpakować potrafi od XP). A NC umiał to w jakichś nowszych wersjach… no, chyba że myli mi się z Midnight Commanderem tudzież FAR-em :)

  5. agent_J:
    December 9th, 2009 o 8:08

    Bash i inne unixowe shity się mogą schować :)

Comments are disabled.
 


© 2020 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.