Come comprimere / decomprimere i file in Powershell?


Risposte:


21

DotNetZip ti consentirà di farlo da PowerShell. Non è una riga, ma la libreria ti permetterà di scrivere lo script PowerShell che ti serve.

È inoltre possibile utilizzare l'interfaccia COM, vedere Comprimere i file con Windows PowerShell, quindi creare un pacchetto di un gadget della barra laterale di Windows Vista .

Googling "zip powershell" o "decomprimi powershell" potrebbe anche rivelare risultati utili.


+1 L'articolo collegato contiene attività utili a differenza della risposta più votata
Ruben Bartelink,

5
-1 per aver suggerito una ricerca su Google. Questo è il miglior risultato StackExchange in una ricerca su Google per "decomprimere powershell"
desiderio di macchina

154

Ecco come è possibile farlo esclusivamente da Powershell senza strumenti esterni. Questo decomprime un file chiamato test.zip nella directory di lavoro corrente:

$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
usa $ destination.Copyhere ($ zip_file.items (), 0x10) per sovrascrivere i file esistenti. 0x4 nasconde la finestra di dialogo e 0x14 li combina, li sovrascrive e nasconde la finestra di dialogo.
Peter,

3
La riga $destination.Copyhere($zip_file.items())esegue la decompressione effettiva.
Jonathan Allen,

2
È possibile suddividere in pacchi quanto sopra in una funzione, se si desidera: 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
Questa dovrebbe essere la risposta accettata.
Tugberk,

2
Questo non riesce per me quando il file zip contiene solo una cartella (gli oggetti sono vuoti)
James Woolfenden,

56

Ora in .NET Framework 4.5, esiste una classe ZipFile che puoi usare in questo modo:

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

1
Questo sarebbe bello se ci fosse un metodo semplice per ExtractToDirectory e un'opzione per sovrascrivere tutti i file esistenti.
James Dunne,

1
Funziona con .NET 4.5. Tuttavia, è necessario anche Powershell V3.
DalSoft,

3
Caricare l'assembly con Add-Type, ad esempio: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne - Se non hai altri file che devi conservare, puoi usare 'Remove-Item -Recurse $ TargetFolder'. Altrimenti, ciò che vuoi può essere fatto, ma non sarebbe banale. Avresti bisogno di aprire lo zip per leggere, quindi camminare sullo zip, eliminando qualsiasi oggetto target precedente e decomprimendo quello nuovo. Fortunatamente per me, la soluzione semplice funziona. ;)
Mike,

3
Si noti che i percorsi dei file relativi utilizzeranno la directory corrente .NET , non quella di PowerShell. Vedi qui . Probabilmente è meglio solo per (Resolve-Path $someDir).Pathgli argomenti.
jpmc26,

18

Potresti voler dare un'occhiata a The PowerShell Community Extensions (PSCX) che ha dei cmdlet specifici per questo.


1
+1 PSCX è un ottimo set di cmdlet aggiuntivi: vorrei solo poter scegliere di più quali desideri e quali no. Sembra che stia cambiando molto nella mia istanza di Powershell ....
marc_s,

Mi sono imbattuto in questo perché in realtà voglio automatizzare l'installazione di PSCX se posso per alcuni colleghi. Provandolo ora per vedere in che tipo di problemi mi
imbatto


5

Trovo la soluzione più semplice per usare solo i binari di infozip che ho usato per anni e usare in un ambiente 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.

Sarebbe semplice mettere un wrapper PowerShell attorno all'output del testo, ma in pratica non ne ho mai avuto bisogno, quindi non mi sono preoccupato.

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


5

Mi piace anche Info-ZIP (il motore Zip presente nella maggior parte delle altre utility Zip) e 7-Zip , un altro preferito che ha sia una GUI che un'utilità Zip da riga di comando. Il punto è che ci sono alcune buone utility da riga di comando che funzioneranno per la maggior parte delle attività di PowerShell.

Esistono alcuni trucchi per eseguire le utility da riga di comando che non sono state create pensando a PowerShell:

  • L'esecuzione di un eseguibile che inizia con un numero nel nome, lo prefigura con una e commerciale (&).

    & 7zip.exe

  • Avvolgi ogni token, l'utilità si aspetta di vedere dalla riga di comando, tra virgolette.

    & "c: \ percorso con spazio \ SomeCommand.exe" "/ parametro2" "/ parametro2" "Valore parametro2" "Valore2` "con un preventivo"

Prova questo:

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

O anche:

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

2

James Holwell Mi piace la tua risposta ma l'ho ampliata un po '

# 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

Ho creato un modulo compatibile con PowerShell 2.0 che utilizza i comandi del sistema operativo Windows nativo per comprimere e decomprimere i file in modo sincrono. Funziona su sistemi operativi meno recenti, come Windows XP, e non richiede .Net 4.5 o altri strumenti esterni. Le funzioni bloccheranno anche l'esecuzione degli script fino a quando tutti i file non saranno stati compressi / decompressi. Puoi trovare maggiori informazioni e il modulo sul mio blog qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.