Como você pode compactar ou descompactar o script usando APENAS os recursos internos do Windows?

294

No Windows, você pode compactar alguns arquivos

clique com o botão direito do mouse em → Enviar paraPasta compactada (zipada)

Descompacte e clique duas vezes no .ziparquivo e extraia os arquivos.

Existe uma maneira de aplicar essas habilidades a partir de um script (arquivo .bat) sem a necessidade de instalar nenhum software de terceiros ?

Roee Gavirel
fonte
16
Bem, provavelmente é para chamá-lo de um arquivo em lotes ou de um programa. (É por isso que estou aqui - tentando fazer um arquivo .bat rápido para "construir" um pouco de produto para um site que requer que ele seja um arquivo zip.)
Jon Coombs
46
Insano que esta pergunta foi encerrada.
18717 Sam Goldberg #
1
É possível mover esta pergunta para Superusuário?
precisa saber é o seguinte
21
Ainda é muito útil e relevante em 2018.: P
Michael Fever

Respostas:

82

Em 2013, isso não era possível. A Microsoft não forneceu nenhum executável para isso.

Veja este link para ver como VBS faz isso. /superuser/201371/create-zip-folder-from-the-command-line-windows

A partir do Windows 8, o .NET Framework 4.5 é instalado por padrão, com System.IO.Compression.ZipArchive e PowerShell disponíveis, é possível escrever scripts para isso, consulte https://stackoverflow.com/a/26843122/71312

Diryboy
fonte
1
Isso não está correto, uma vez que o PS permite isso e está pré-instalado no Windows e está disponível na linha de comando.
Dan Atkinson
4
@DanAtkinson Atualizado. Foi respondida em 2013, o link fornecia uma maneira VBS. O modo PS precisa do .Net 4.5, que precisa do Windows 8 ou superior.
Diryboy
Obrigado pela atualização! Alterei o meu voto em conformidade. :)
Dan Atkinson
6
@MichaelMrozek Bem, "linha de comando" refere-se genericamente a qualquer linha de comando, não especificamente CMD / COMMAND, e o PS definitivamente é uma linha de comando, assim como bash, sh, rsh no * nix. Mas apenas para ir além, já que você pode executar o PowerShell na linha de comando, ele responde à pergunta mesmo se você quiser acreditar que cmd / command é a única linha de comando.
Robert McKee
1
Isso foi possível em 2013 (sem a instalação de nenhum software extra). Veja a pergunta do superusuário . Isso é possível desde que o Windows XP foi lançado em 2001. A funcionalidade ZIP incorporada no Windows XP pode ser aproveitada porque é exposta através de uma interface COM .
Peter Mortensen
180

Para expandir a solução PowerShell de Steven Penny, você pode incorporá-la em um arquivo em lotes chamando powershell.exe assim:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Como disse Ivan Shilo, isso não funcionará no PowerShell 2, requer o PowerShell 3 ou superior e o .NET Framework 4.

Jason Duffett
fonte
1
Na verdade, isso foi disponibilizado no .NET 4.5.
qJake
10
Para aqueles (como eu) que quer saber como extrato para o diretório real (em vez de criar um novo diretório) basta definir o parâmetro de destino para '.', por exemplo:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
Podemos usar esses comandos para aumentar a compactação? Como torná-lo Ultra compressão para reduzir o tamanho do arquivo?
Nigel Fds
1
Qual é o propósito & {}? Com o PS5, isso também funciona:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton
@RoiDanton Como usar stringformatter para definir src.zip e dest.zip?
PySaad 4/03/19
161

A partir do .NET 4.5 , o PowerShell pode fazer isso:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Nas últimas duas linhas, bare foopode ser substituído pelo nome que você deseja que a pasta contenha ou qualquer que seja o nome da pasta preexistente. foo.zipnos dois casos, atua como o arquivo zip para salvar ou descompactar.

Steven Penny
fonte
17
Isso é como no .NET 4.5.
qJake
Podemos usar esses comandos para aumentar a compactação? Como torná-lo Ultra compressão para reduzir o tamanho do arquivo?
Nigel Fds
Eu tenho o .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 instalado via em uma VM instalada a partir daqui: developer.microsoft.com/en-us/microsoft-edge/tools/vms , e isso funciona. Então, eu estou supondo que você não precisa do .NET 4.5
alpha_989
Esta é a solução mais prática em sistemas modernos, isso reduzirá em mais de 2 GB o tamanho do zip, enquanto o Powershell "Compress-Archive" padrão falhará.
Shukri Adams 16/04
135

Se você tiver o Java instalado, poderá compactar para um arquivo ZIP usando o jarcomando:

jar -cMf targetArchive.zip sourceDirectory

c = Cria um novo arquivo morto.

M = Especifica que um arquivo de manifesto não deve ser adicionado ao arquivo morto.

f = indica o nome do arquivo de destino.

Noam Manos
fonte
3
impressionante, graças, exatamente o que eu estava procurando ... FYI - eu tinha que remover o caractere de subtração ao DOS ... por exemplo frasco CMF target.zip SourceDir
mlo55
3
Nada mal, mas você precisa do JDK instalado, não do JRE.
Pdem 07/07
2
Nice one, provavelmente a maioria solução independente de plataforma para isso;)
Adrian
YMMD. Excelente ideia. me poupou muito tempo.
Gorefest 13/06/19
3
É este coberto por "... usando apenas o Windows' built-in capacidades?" (ênfase minha) #
317 Peter Mortensen
84

PowerShell 5.0

De Microsoft.PowerShell.Archivevocê pode usar:

Por exemplo:

  • Crie a result.zippartir da Testpasta inteira :

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Extraia o conteúdo da pasta result.zipespecificada Test:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
ROMANIA_engineer
fonte
13
Isso funciona muito bem, obrigado. Para qualquer pessoa que termine aqui em baixo, você pode usar powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipdiretamente da linha de comando sem precisar criar um script (supondo que você tenha o Powershell v5 instalado, o que você pode fazer pelo menos voltando ao Windows 7).
Beems
Funciona muito bem, adicione a opção -Force se você estiver planejando executá-la novamente.
Robin Salih
1
@ Beem, obrigado! Mas acho que você enlouqueceu o caminho / destino ao contrário?
Yiping
Isso funciona, mas o arquivo é compactado de forma diferente, então o que acontece se você usar o Windows Explorer "Enviados para -> comprimido pasta (zipada)" A versão PowerShell é maior e alguns programas não podem extrair
Eric Labashosky
O arquivo compactado tem um limite máximo de 2 GB no arquivo de entrada
Sergei Rodionov
37

Não é exatamente um ZIP, mas a única maneira de compactar um arquivo usando as ferramentas do Windows é:

makecab <source> <dest>.cab

Para descomprimir:

expand <source>.cab <dest>

Exemplo avançado (de ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Mais informações: usos avançados do makecab , expand , makecab

Federico Santamorena
fonte
34

Usando o 7-Zip:

Zip : você tem uma pasta fooe deseja compactá-la paramyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Descompacte : você deseja descompactá-lo ( myzip.zip) para o diretório atual ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
fonte
31
Observe a pergunta:without the need to install any 3rd party
Roee Gavirel
16
O @RoeeGavirel 7zip deve ser uma das primeiras coisas que você instala em qualquer instalação do Windows: P
developerbmw
3
@developerbmw - A.why é isso? B. Estou manipulando ~ 100 máquinas em produção que não têm 7 zip nelas. Para instalar isso, eu precisaria instalar o DevOps em todas essas máquinas e em todas as novas máquinas que serão adicionadas aos clusters. Eu prefiro evitá-lo.
Roee Gavirel
1
@Roland: você poderia ser espacífico; onde isso dá errado? Isso ajudará a todos.
Monir
1
@Roland: Apenas verificado, a sintaxe está funcionando bem. Provavelmente, você está tentando com a pasta "foo" que não está presente em sua máquina. Apenas adivinhe.
Monir
9

Eu tenho procurado responder a essa pergunta exata e, a partir de minha pesquisa, a resposta do DiryBoy parece ser precisa.

Eu encontrei o programa compact.exe compacta arquivos, mas não para criar um arquivo altamente compactado (ou conjunto de arquivos). É semelhante à opção que você obtém ao clicar com o botão direito do mouse em uma letra de unidade ou partição no Windows. Você tem a opção de limpar (remover arquivos temporários, etc.), bem como compactar arquivos. Os arquivos compactados ainda estão acessíveis, mas são compactados apenas para criar espaço em uma unidade com pouco espaço.

Eu também encontrei o compress.exe que eu tinha no meu computador. Não é nativo na maioria das máquinas Windows e faz parte do kit de recursos de 2003. Ele cria um tipo de arquivo compactado, mas é realmente mais semelhante aos arquivos de um disco de instalação do Windows (tem o sublinhado como o último caractere da extensão ou nome do arquivo). E o comando extract.exe extrai esses arquivos.

No entanto, o mantra é que, se puder ser feito de forma nativa por meio da GUI, provavelmente haverá uma maneira de fazê-lo por lote, .vbs ou algum outro tipo de script na linha de comando. Como o Windows teve a opção 'enviar para' para criar um arquivo zip, eu sabia que tinha que haver uma maneira de fazê-lo via linha de comando e encontrei algumas opções.

Aqui está um ótimo link que mostra como compactar um arquivo usando comandos nativos do Windows.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Testei-o com um diretório contendo vários arquivos e pastas aninhados e funcionou perfeitamente. Basta seguir o formato da linha de comando.

Existe também uma maneira de descompactar os arquivos via linha de comando, que eu também encontrei. Uma maneira, apenas abre uma janela do Explorer mostrando qual é o conteúdo do arquivo compactado. Alguns deles também usam Java, que não é necessariamente nativo do Windows, mas é tão comum que quase parece.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Como descompactar um arquivo usando a linha de comando?

LostUser
fonte
8

Você pode usar um script VBScript agrupado em um arquivo BAT. Este código funciona em um PATH relativo.

Não há necessidade de ferramentas ou dependências de terceiros. Basta definir SOURCEDIReOUTPUTZIP .

Nome do arquivo: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Exemplo de uso

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

Como alternativa, você pode parametrizar esse arquivo substituindo a linha CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%por CScript _zipup.vbs %1 %2, nesse caso, pode ser chamado ainda mais facilmente, simplesmente chamando CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
fonte
A linha que cria o arquivo zip inicial precisa ser escapada, caso contrário, ela não termina no script.
cup
Sim, este é o caminho a seguir (como na pergunta do superusuário ).
Peter Mortensen
Eu adicionei uma versão escapada corretamente como resposta.
fsteff 20/09/19
5

Eu tenho um problema com todas essas soluções.

Eles não são exatamente iguais, e todos criam arquivos com uma pequena diferença de tamanho em comparação com os RMB --> send to --> compressed (zipped) foldercriados na mesma pasta de origem. A diferença de tamanho mais próxima que tive é de 300 KB de diferença (script> manual), feita com:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Observe o -CompressionLevel . Existem três valores possíveis : Mais rápido, Sem compactação e Ótimo, (Padrão: Ótimo))

Eu queria criar um arquivo .bat que comprima automaticamente uma pasta de plug-in do WordPress em que estou trabalhando, em um arquivo .zip, para que eu possa carregá-lo no site do WordPress e testar o plug-in.

Mas, por alguma razão, não funciona com nenhuma dessas compressões automáticas, mas funciona com a compressão manual de RMB, o que acho realmente estranho.

E os arquivos .zip gerados por script quebram os plugins do WordPress a ponto de não poderem ser ativados e também não podem ser excluídos de dentro do WordPress. Eu tenho que fazer o SSH no "verso" do servidor e excluir os arquivos de plug-in enviados manualmente, manualmente. Enquanto os arquivos gerados manualmente por RMB funcionam normalmente.

Sebastian Norr
fonte
O que são "wbr" e "RMB" ?
Peter Mortensen
RMB = Botão direito do mouse. <wbr> = uma tag HTML que indica uma "oportunidade do Word BReak" para o navegador (removida porque não funcionou).
Sebastian Norr 19/08/19
4

Se você precisar fazer isso como parte de um script, a melhor maneira é usar Java. Supondo que o diretório bin esteja no seu caminho (na maioria dos casos), você pode usar a linha de comando:

jar xf test.zip

Se o Java não estiver no seu caminho, faça referência diretamente a ele:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
eddyoc
fonte
3

Código aberto é seu amigo :-)

Aqui está o descompacte : http://gnuwin32.sourceforge.net/packages/unzip.htm

Também existe um comando ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

O download dos binários é suficiente.

JanBorup
fonte
No Windows 8, ele gera um erro: bzip2.dll está ausente.
Doug
1
@Doug diz que bzip2 é um requisito na página e tem um link para o download
Sam
11
A pergunta original era como usar os comandos internos do Windows. Além disso, é indesejável exigir que seus usuários instalem várias soluções de terceiros, porque sua própria ferramenta ou solução agora está limitada a usuários com permissão administrativa em seu computador ou que não se importam com uma coleção crescente de pequenas dependências em seus sistemas. . Open source pode ser seu amigo, mas pacotes de código aberto que exigem a você instalar outros pacotes open source que exigem que você instalar outros pacotes de código aberto e assim por diante são decididamente não o seu amigo.
precisa saber é o seguinte
SourceForge está bloqueado pela política de firewall do meu trabalho :-(
SnookerC
1
Isso ainda usa terceiro sotware partido
Деян Добромиров
3

Esta é uma versão atualizada da resposta fornecida por @ PodTech.io

Esta versão tem todo o código vbs escapado corretamente no arquivo em lotes. Também é criado em uma sub-rotina, que pode ser chamada com uma única linha de qualquer lugar do seu script em lote:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof
fsteff
fonte
2

Você diz que está tentando fazer isso sem um software de terceiros. Não tenho certeza se você consideraria o software "de terceiros" do .NET.

Mas você pode criar seu próprio utilitário de linha de comando no .NET. Não deve exigir mais do que algumas linhas de código.

Classe ZipFile

NL3294
fonte
0

Adicionando a resposta de @Jason Duffett e seus comentários, aqui está um script que obtém entrada e saída (nome do arquivo e nome do diretório, respectivamente) do usuário:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Uso:

unzip.bat path\to\file.zip path\to\output\directory
HeyJude
fonte
-4

Para compactar um arquivo:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 compressão máxima
  • -m exclui o arquivo original após uma compressão bem-sucedida
  • -o defina a data de modificação do arquivo zip igual ao arquivo original
  • Pena que é preciso dar o nome do arquivo zip desejado, em vez de apenas adicionar a extensão .zip ao nome do arquivo a compactar
Tulains Córdova
fonte
4
duas coisas: (1) "zip" não é fornecido com o Windows; portanto, provavelmente é um terceiro que você possui. e, como minha pergunta mencionou, não consigo instalar terceiros. (2) O motivo pelo qual você precisa fornecer o nome desejado é porque compactar a criação e o arquivamento de arquivos (como uma pasta em uma sessão espírita) e você pode ter mais de um arquivo lá.
Roee Gavirel
@RoeeGavirel No servidor, encontrei o utilitário de linha de comando zip, não há nenhuma ferramenta GUI do winzip instalada, então imaginei que a ferramenta CLI vazia viesse com o Windows. Por outro lado, os utilitários de compactação Unix / Linux, como compress, bzip2 e gzip, criam um arquivo compactado com o mesmo nome do arquivo original mais a extensão (.Z, .bz2 ou .gz), se você não passar o nome desejado. arquivo compactado.
Tulains Córdova
-4

Você pode descompactar um arquivo compactado do Windows compactado ou nativo usando o comando Expandir , por exemplo

expand MyFile.zip myFile
Lança
fonte
9
Eu tentei isso, mas cópias MyFile.zip a pasta myFile,
fhnaseer
Isso me ajudou a C: \> expand /?
snow6oy
11
Expandir funciona apenas com o arquivo .cab e não é apropriado para arquivos zip.
рüффп
2
O mesmo vale para os outros comentários aqui. Expand file.zip fileapenas copia o zip para outro arquivo sem a extensão. Não descompacta o ZIP em uma pasta.
Dave Marley