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.