2010-10-20 07:50:38 +0000 2010-10-20 07:50:38 +0000
63
63

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

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

Estava a pensar em algo do tipo “enviar para pasta comprimida” mas não sei como o fazer…

Respostas (10)

41
41
41
2015-04-06 21:26:20 +0000

A partir do PowerShell 5 (Fevereiro 2016), pode utilizar o “Compress-Archive”:

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

ou:

Compress-Archive input.txt output.zip

input.txt aqui também pode ser um directório https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1

7
7
7
2010-10-20 07:57:39 +0000

Não creio que exista uma linha de comando para ficheiros ZIP incorporados no Windows (para além de compress no Server 2003 Resource Kit). Teria de usar uma terceira parte. Toda a gente adora 7zip !

6
6
6
2010-10-20 08:32:39 +0000

Combinei este guião de várias fontes diferentes para melhor se adequar às minhas necessidades. Copie e cole o script em um arquivo com a extensão “.vbs”. O script foi originalmente feito para 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 objectos Shell que este usa.

Utilização: na caixa de correr ou na linha de comando put-

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

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

Não irá 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
4
4
4
2018-07-04 11:29:13 +0000

Imagine que quer comprimir a mesma pasta que está no Prompt de Comando SEM abrir uma janela de powershell:

powershell Compress-Archive . publish.zip
2
2
2
2018-01-18 22:50:18 +0000

Aqui está outra ideia, de 4 fontes diferentes; não as minhas ideias, mas compilei-as para que funcionassem 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>
2
2
2
2016-11-30 12:19:08 +0000

É possível executar o PowerShell script da BAT. O ficheiro Bat recebe o caminho para o dir a ser zipado e o nome do ficheiro 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
1
1
1
2013-11-15 04:21:10 +0000

Aqui está um excelente link que mostra como zipar um ficheiro usando os comandos nativos do Windows. [ Pode zipar um ficheiro a partir do prompt de comandos usando apenas a capacidade integrada do Windows para zipar ficheiros? (https://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili)

Testei-o com um directório contendo múltiplos ficheiros e pastas aninhados e funcionou perfeitamente. Basta seguir o formato da linha de comandos.

Existe também uma forma de descompactar os ficheiros através da linha de comandos que também encontrei. De uma maneira, basta abrir uma janela exploradora mostrando qual é o conteúdo do ficheiro zipado. Alguns destes também usam Java que não é necessariamente nativo do windows mas é tão comum que quase parece. O Windows 7 tem o descompactador na linha de comandos instalado por defeito? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

1
1
1
2017-08-16 06:41:05 +0000

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

Windows, claro, tem o seu próprio algoritmo de compressão incorporado para utilizar ficheiros zip, mas, na realidade, tem um desempenho deficiente quando comparado com o produto de código aberto 7zip encontrado aqui http://www.7- zip.org/

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

7Zip suporta uma vasta gama de ficheiros, incluindo ZIP, RAR, CAB e ISO e o seu próprio formato 7z.

Pode ver a ajuda de linha de comandos: “C:\Program Files\7-Zip\7z.exe” –help

para executar uma simples adição ao arquivo zip:

“C:\Program Files\7-Zip\7z.exe” um nome de arquivo.zip c:\path

1
1
1
2015-01-07 14:22:03 +0000

Vou colocar algo relacionado com a resposta WSkids , pois infelizmente não posso usar a função de comentário.

Usando o método CopyHere() na VBS introduz várias questões. Um desses problemas é que o método retorna imediatamente enquanto o processo de cópia começa em segundo plano, enquanto múltiplas chamadas CopyHere() interferem umas nas outras e o ZIP não é criado corretamente. Um loop de espera é necessário aqui para corrigir isso. O meu laço de espera é baseado numa resposta a um problema semelhante publicado aqui .

Aqui está uma versão actualizada que corrige o erro “Object required” reportado por pihentagy . É um problema de timing, uma vez que o ficheiro ZIP recentemente criado é incluído na colecçã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
1
1
1
2015-01-22 12:27:53 +0000

Aqui a minha tentativa de resumir as janelas com capacidades de compressão e descompressão - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

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