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

Creare una cartella .zip dalla linea di comando - (Windows)

E’ possibile creare un file .zip da una cartella nella linea di comando, non voglio usare eseguibili di terze parti.

Pensavo a qualcosa come ‘invia alla cartella compressa’ ma non so come fare…

Risposte (10)

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

A partire da PowerShell 5 (febbraio 2016), è possibile utilizzare “Compress-Archive”:

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

o:

Compress-Archive input.txt output.zip

input.txt qui potrebbe anche essere una directory 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

Non credo che ci sia una linea di comando per i file ZIP incorporati in Windows (oltre a compress in Server 2003 Resource Kit). Dovresti usare una terza parte. Tutti amano 7zip !

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

Ho combinato questo script da diverse fonti diverse per soddisfare meglio le mie esigenze. Copia e incolla lo script in un file con estensione “.vbs”. Lo script è stato originariamente realizzato per Windows XP, ma funziona anche in Windows 7 x64 Ultimate - non c'è garanzia che Windows mantenga i vari oggetti Shell che utilizza.

Uso: nella casella di esecuzione o nella riga di comando put-

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

Path to script, cartella sorgente, file zip da creare (includere .zip alla fine).

Non copierà cartelle vuote, quindi fate attenzione.

Ecco il codice 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

Immaginate di voler comprimere la stessa cartella che si trova su Command Prompt SENZA aprire una finestra powershell:

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

Ecco un'altra idea, da 4 fonti diverse; non le mie idee, ma le ho raccolte per farla funzionare per me

<!-- : 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

È possibile eseguire lo script PowerShell da BAT. Il file Bat riceve il percorso del dir da zippare e il nome del file zip come parametri.

@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

Ecco un ottimo link che mostra come zippare un file utilizzando i comandi nativi di Windows. Si può zippare un file dal prompt dei comandi utilizzando SOLO la capacità integrata di Windows per zippare i file?

L'ho testato con una directory contenente più file e cartelle annidate e ha funzionato perfettamente. Basta seguire il formato della riga di comando.

C'è anche un modo per decomprimere i file tramite la riga di comando che ho trovato anch'esso. Un modo è quello di aprire una finestra di explorer che mostra il contenuto del file zippato. Alcuni di questi usano anche Java, che non è necessariamente nativo di Windows, ma è così comune che sembra quasi che lo sia. Windows 7 ha installato di default lo scompattatore a riga di comando? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

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

Questa è una vecchia domanda, ma la sua rilevanza è ancora attuale.

Windows naturalmente ha il suo proprio algoritmo di compressione integrato per l'utilizzo di file zip, ma, funziona davvero male se paragonato al prodotto open source 7zip che si trova qui http://www.7- zip.org/

Altri hanno già discusso vari metodi per utilizzare le funzioni integrate di Windows, la mia soluzione richiede l'installazione del software aggiuntivo.

7Zip supporta una vasta gamma di file, tra cui ZIP, RAR, CAB e ISO ed ha un proprio formato 7z.

È possibile visualizzare la guida da riga di comando: “C:\Program Files\7-Zip\7z.exe” –help

per eseguire una semplice aggiunta all'archivio zip:

“C:\Program Files\7-Zip\7z.exe” un nome file.zip c:\ \path

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

Pubblicherò qualcosa relativo alla risposta WSkids poiché purtroppo non posso usare la funzione di commento.

L'uso del metodo CopyHere() in VBS introduce diversi problemi. Uno di questi problemi è che il metodo ritorna immediatamente mentre il processo di copia inizia in background, mentre più chiamate CopyHere() interferiranno tra loro e lo ZIP non verrà creato correttamente. Per risolvere questo problema è necessario un ciclo di attesa. Il mio ciclo di attesa si basa su una risposta ad un problema simile pubblicato qui .

Ecco una versione aggiornata che corregge l'errore “Object required” segnalato da pihentagy . Si tratta di un problema di tempistica, poiché il file ZIP appena creato è incluso nella raccolta degli item quando lo script viene eseguito su macchine veloci.

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

Ecco il mio tentativo di riassumere le finestre di capacità incorporate per la compressione e la non compressione - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

con alcune soluzioni date che dovrebbero funzionare su quasi tutte le macchine Windows.