Jak spakować / rozpakować pliki w Powershell?


Odpowiedzi:


21

DotNetZip pozwoli ci to zrobić z PowerShell. Nie jest to jednowierszowa, ale biblioteka pozwoli Ci napisać potrzebny skrypt PowerShell.

Możesz także użyć interfejsu COM, zobacz Kompresowanie plików za pomocą Windows PowerShell, a następnie zapakowanie gadżetu paska bocznego systemu Windows Vista .

Googling „zip powershell” lub „unzip powershell” może również przynieść przydatne wyniki.


+1 Powiązany artykuł ma przydatne zadania, w przeciwieństwie do najbardziej uprzywilejowanej odpowiedzi
Ruben Bartelink,

5
-1 za sugerowanie wyszukiwania Google. To najlepszy wynik StackExchange w wyszukiwaniu Google „rozpakuj PowerShell”
maszyna tęskni

154

W ten sposób możesz to zrobić wyłącznie z Powershell bez żadnych zewnętrznych narzędzi. To rozpakowuje plik o nazwie test.zip do bieżącego katalogu roboczego:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
użyj $ destination.Copyhere ($ zip_file.items (), 0x10) do zastąpienia istniejących plików. 0x4 ukrywa okno dialogowe, a 0x14 łączy je i zastępuje i ukrywa okno dialogowe.
Peter

3
Linia $destination.Copyhere($zip_file.items())faktycznie rozpakowuje.
Jonathan Allen

2
Możesz spakować powyższe w funkcję, jeśli chcesz: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
James Holwell

6
To powinna być zaakceptowana odpowiedź.
tugberk,

2
Nie udaje mi się to, gdy plik zip zawiera tylko folder (elementy są puste)
James Woolfenden,

56

Teraz w .NET Framework 4.5 dostępna jest klasa ZipFile , której można użyć w następujący sposób:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
To byłoby wspaniale, gdyby nie było to prosta metoda ExtractToDirectory i możliwość, aby zastąpić wszystkie istniejące pliki.
James Dunne,

1
Działa z .NET 4.5. Potrzebujesz jednak również Powershell V3.
DalSoft,

3
Załaduj zestaw z Add-Type, na przykład: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne - Jeśli nie masz innych plików, które musisz zachować, możesz skorzystać z opcji „Usuń-Odzyskaj-Odzyskaj $ TargetFolder”. W przeciwnym razie możesz zrobić to, co chcesz, ale nie byłoby to łatwe. Trzeba by otworzyć zip do odczytu, a następnie przejść zip, usuwając każdy poprzedni obiekt docelowy i rozpakować nowy. Na szczęście dla mnie proste rozwiązanie działa. ;)
Mike

3
Ostrzegamy, że względne lokalizacje plików będą korzystały z bieżącego katalogu .NET , a nie PowerShell. Zobacz tutaj . Prawdopodobnie lepiej tylko (Resolve-Path $someDir).Pathz argumentami.
jpmc26,

18

Warto sprawdzić rozszerzenia społeczności PowerShell (PSCX), które mają specjalnie do tego przeznaczone polecenia cmdlet.


1
+1 PSCX to świetny zestaw dodatkowych poleceń cmdlet - chciałbym tylko móc wybrać więcej, które chcę, a które nie. Wygląda na to, że wiele się zmienia w mojej instancji
PowerShell

Natknąłem się na to, ponieważ tak naprawdę chcę zautomatyzować instalację PSCX, jeśli mogę dla niektórych współpracowników. Próbuję teraz, aby zobaczyć, jakie problemy
napotykam

16

Wiem, że to bardzo stare pytanie, ale właśnie zobaczyłem, że jest to link na Twitterze i pomyślałem, że opublikuję aktualną odpowiedź.

PowerShell 5, obecnie dostępny w systemie Windows 10 lub za pośrednictwem wersji zapoznawczej Windows Management Framework 5 , zawiera dwa wbudowane polecenia cmdlet do „kompresowania” i „rozpakowywania”:


3
Jest to dobra rzecz, aby dostarczyć nowych informacji do starych pytań. ;) +1
jpmc26

5

Znajduję najprostsze rozwiązanie, aby po prostu użyć plików binarnych infozip, z których korzystałem od lat i które używam w środowisku UNIX.

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

Łatwo byłoby umieścić otoczkę PowerShell wokół tekstu wyjściowego, ale w praktyce nigdy tego nie potrzebuję, więc nie zawracałem sobie głowy.

http://www.info-zip.org/


5

Lubię też Info-ZIP (silnik Zip występujący w większości innych programów Zip) i 7-Zip , kolejny ulubiony, który ma zarówno GUI, jak i narzędzie Zip z linii poleceń. Chodzi o to, że istnieją pewne dobre narzędzia wiersza polecenia, które będą działać dla większości zadań PowerShell.

Istnieje kilka sztuczek w uruchamianiu narzędzi wiersza poleceń, które nie zostały zbudowane z myślą o PowerShell:

  • Uruchamianie pliku wykonywalnego, który zaczyna się od numeru w nazwie, poprzedza go znakiem „Ampersand” (&).

    I 7zip.exe

  • Zawiń każdy token, którego narzędzie oczekuje w wierszu poleceń, w cudzysłowie.

    & „c: \ ścieżka ze spacją \ SomeCommand.exe” ”/ parametr2” „/ parametr2” „Wartość parametru2” „Wartość2” „z cytatem”

Spróbuj tego:

zip filename.zip (Get-ChildItem somepath\*)

Lub nawet:

zip filename.zip (Get-Content ListOfFiles.txt)

2

James Holwell Podoba mi się twoja odpowiedź, ale trochę ją rozwinąłem

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

Utworzyłem moduł kompatybilny z PowerShell 2.0, który używa natywnych poleceń systemu operacyjnego Windows do synchronizowania i rozpakowywania plików. Działa to na starszych systemach operacyjnych, takich jak Windows XP, i nie wymaga .Net 4.5 ani żadnych innych narzędzi zewnętrznych. Funkcje będą również blokować wykonywanie skryptu, dopóki wszystkie pliki nie zostaną spakowane / rozpakowane. Więcej informacji i moduł można znaleźć na moim blogu tutaj .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.