Como compactar / descompactar arquivos no Powershell?

Respostas:

21

DotNetZip permitirá que você faça isso no PowerShell. Não é uma linha única, mas a biblioteca permitirá que você escreva o script do PowerShell necessário.

Você também pode usar a interface COM, consulte Compactar arquivos com o Windows PowerShell e empacotar um gadget da barra lateral do Windows Vista .

Pesquisar no Google "zip powershell" ou "descompactar powershell" também pode gerar resultados úteis.

Kevin Kuphal
fonte
+1 Artigo vinculado tem Tarefas úteis, diferentemente da resposta mais votada #
Ruben Bartelink 10/04
5
-1 por sugerir uma pesquisa no Google. Este é o principal resultado do StackExchange em uma pesquisa no Google por "descompactar powershell"
máquina com o desejo de
154

É assim que você pode fazer isso puramente no Powershell sem nenhuma ferramenta externa. Isso descompacta um arquivo chamado test.zip no diretório de trabalho atual:

$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())
Ameer Deen
fonte
26
use $ destination.Copyhere ($ zip_file.items (), 0x10) para substituir os arquivos existentes. 0x4 oculta a caixa de diálogo e 0x14 os combina e substitui e oculta a caixa de diálogo.
Peter
3
A linha $destination.Copyhere($zip_file.items())faz o descompactação real.
Jonathan Allen
2
Você pode parcelar o acima em uma função, se você quisesse: 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
Essa deve ser a resposta aceita.
tugberk
2
Esta falha para mim quando o arquivo zip contém apenas uma pasta (itens está vazia)
James Woolfenden
56

Agora no .NET Framework 4.5, há uma classe ZipFile que você pode usar assim:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
mousio
fonte
1
Isso seria ótimo se houvesse um método simples para ExtractToDirectory e uma opção para substituir todos os arquivos existentes.
James Dunne
1
Isso funciona com o .NET 4.5. No entanto, você também precisa do Powershell V3.
DalSoft
3
Carregue a montagem com Add-Type, por exemplo: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike
2
@ JamesDunne - Se você não tem outros arquivos que precisa preservar, use 'Remove-Item -Recurse $ TargetFolder'. Caso contrário, o que você deseja pode ser feito, mas não seria trivial. Você precisaria abrir o zip para leitura e, em seguida, percorrer o zip, excluindo qualquer objeto de destino anterior e descompactando o novo. Para minha sorte, a solução fácil funciona. ;)
Mike
3
Esteja avisado de que os locais de arquivos relativos usarão o diretório atual do .NET , não o PowerShell. Veja aqui . Provavelmente é melhor apenas para (Resolve-Path $someDir).Pathos argumentos.
precisa saber é
18

Você pode conferir as PSCX (Extensões da Comunidade do PowerShell), que possuem cmdlets especificamente para isso.

Kevin Colby
fonte
1
O +1 do PSCX é um ótimo conjunto de cmdlets complementares - eu gostaria de poder escolher mais quais e quais não quero. Ele parece estar mudando um lote inteiro no meu exemplo Powershell ....
marc_s
Eu me deparei com isso porque eu realmente quero automatizar a instalação do PSCX, se puder, para alguns colegas de trabalho. Tentá-lo agora para ver que tipo de problemas eu me deparo
jcolebrand
5

Eu acho a solução mais simples para usar apenas binários do infozip que usei há anos e uso em um 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.

Seria fácil colocar um invólucro do PowerShell em torno da saída de texto, mas na prática eu nunca preciso disso, então não me incomodei.

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

Brian Reiter
fonte
5

Também gosto do Info-ZIP (o mecanismo Zip encontrado na maioria dos outros utilitários Zip) e do 7-Zip , outro favorito que possui um utilitário Zip para GUI e linha de comando. O ponto é que existem alguns bons utilitários de linha de comando que funcionarão para a maioria das tarefas do PowerShell.

Existem alguns truques para executar utilitários de linha de comando que não foram criados com o PowerShell em mente:

  • A execução de um executável que começa com um número no nome, o antecede com um E comercial (&).

    & 7zip.exe

  • Agrupe cada token, o utilitário espera ver na linha de comando, entre aspas.

    & "c: \ caminho com espaço \ SomeCommand.exe" "/ parameter2" "/ parameter2" "Valor do parâmetro2" "Valor2` "com uma citação"

Tente o seguinte:

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

Ou até:

zip filename.zip (Get-Content ListOfFiles.txt)
Nathan Hartley
fonte
2

James Holwell Gostei da sua resposta, mas a expandi um pouco

# 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()) 
}
Nico
fonte
0

O WinRAR pode funcionar no modo CMD, aceitando argumentos

adoptilot
fonte
0

Criei um módulo compatível com PowerShell 2.0 que usa os comandos nativos do sistema operacional Windows para compactar e descompactar arquivos de maneira síncrona. Isso funciona em sistemas operacionais mais antigos, como o Windows XP, e não requer o .Net 4.5 ou quaisquer outras ferramentas externas. As funções também bloquearão a execução do script até que todos os arquivos tenham sido compactados / descompactados. Você pode encontrar mais informações e o módulo no meu blog aqui .

cão mortal
fonte