Crie a pasta .zip a partir da linha de comando - (Windows)

49

É possível criar um arquivo .zip a partir de uma pasta na linha de comando, não quero usar nenhum executável de terceiros.

Eu estava pensando em algo como 'enviar para uma pasta compactada', mas não sei como fazer isso ...

    
por Steven Penny 20.10.2010 / 09:50

10 respostas

27

A partir do PowerShell 5 (fevereiro de 2016), você pode usar o "Compactar arquivo":

Compress-Archive -Path input.txt -DestinationPath output.zip

Ou:

Compress-Archive input.txt output.zip

link

    
por 06.04.2015 / 23:26
7

Eu não acho que há uma linha de comando para arquivos ZIP embutidos no Windows (Other than compress no Server 2003 Resource Kit). Você teria que usar um terceiro. Todo mundo ama 7zip !

    
por 20.10.2010 / 09:57
6

Combinei esse script de várias fontes diferentes para melhor atender às minhas necessidades. Copie e cole o script em um arquivo com a extensão ".vbs". O script foi feito originalmente para o Windows XP, mas também funciona no Windows 7 x64 Ultimate - não há garantias se o Windows irá manter em torno dos vários objetos Shell que ele usa.

Uso: na caixa de execução ou na linha de comando, coloque -

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

Caminho para o script, pasta de origem, arquivo zip para fazer (incluir .zip no final).

Não copiará pastas vazias, por isso tenha cuidado.

Aqui está o código vbs ---

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing
    
por 20.10.2010 / 10:32
1

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

Você pode compactar um arquivo a partir do prompt de comando usando APENAS o recurso interno do Windows para compactar arquivos?

Eu testei 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 encontrei também. Uma maneira é abrir uma janela do explorador mostrando o conteúdo do arquivo zipado. Alguns deles também usam Java, que não é necessariamente nativo para o Windows, mas é tão comum que quase parece ser assim.

O Windows 7 tem descompactar na linha de comando instalada por padrão?

link

    
por 15.11.2013 / 05:21
1

Esta é uma questão antiga, mas a relevância ainda é atual.

O Windows tem seu próprio algoritmo de compactação embutido para usar arquivos zip, mas ele realmente tem um desempenho ruim quando comparado ao produto de código aberto 7zip encontrado aqui link

Outros já discutiram vários métodos para usar as funções internas do Windows. Minha solução requer a instalação do software adicional.

O 7Zip suporta uma ampla gama de arquivos, incluindo ZIP, RAR, CAB e ISO, e seu próprio formato 7z.

Você pode ver a ajuda da linha de comando: "C: \ Arquivos de programas \ 7-Zip \ 7z.exe" --help

para executar um simples acréscimo ao arquivo zip:

"C: \ Arquivos de programas \ 7-Zip \ 7z.exe" um nome de arquivo.zip c: \ caminho

    
por 16.08.2017 / 08:41
0

Vou postar algo relacionado a WSkids responder com a mesma tristeza que não posso usar a função de comentário.

O uso do método CopyHere () no VBS apresenta vários problemas. Um desses problemas é que o método retorna imediatamente enquanto o processo de cópia inicia em segundo plano, enquanto várias chamadas CopyHere () interferem umas nas outras e o ZIP não será criado corretamente. Um loop de espera é necessário aqui para corrigir isso. Meu loop de espera é baseado em uma resposta a um problema semelhante publicado aqui .

Aqui está uma versão atualizada que corrige o erro "Objeto obrigatório" relatado por pihentagy . É um problema de tempo, pois o arquivo ZIP recém-criado é incluído na coleção Items quando o script é executado em máquinas rápidas.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing
    
por 07.01.2015 / 15:22
0

Aqui estou minha tentativa de resumir as capacidades internas das janelas para compactação e descompactação - link

com algumas soluções fornecidas que devem funcionar em quase todas as máquinas Windows.

    
por 22.01.2015 / 13:27
0

É possível executar o script do PowerShell a partir do BAT. O arquivo de batimento recebe o caminho para o dir a ser zipado e o nome do arquivo zip como parâmetros.

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!'    > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem           >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal
    
por 30.11.2016 / 13:19
0

Aqui está outra ideia, de 4 fontes diferentes; não minhas idéias, mas eu as compilei para fazer isso funcionar para mim

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

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

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

'Required!
wScript.Sleep 2000
</script></job>
</package>
    
por 18.01.2018 / 23:50
0

Imagine que você deseja compactar a mesma pasta em que está no Prompt de Comando SEM abrir uma janela do PowerShell:

powershell Compress-Archive . publish.zip
    
por 04.07.2018 / 13:29

Tags