2010-02-19 19:46:23 +0000 2010-02-19 19:46:23 +0000
113
113

È possibile zippare un file dal prompt dei comandi utilizzando SOLO la capacità integrata di Windows per zippare i file?

Ho un file batch che produce un file di testo. Ho pensato che sarebbe stato bello poterlo zippare anche io.

Questo sarà usato in un ambiente non controllato, quindi non posso fare supposizioni sulla presenza di prodotti software di terze parti come 7-Zip , ecc. Questo deve usare la capacità ora incorporata di Windows per zippare i file.

Risposte (12)

86
86
86
2010-02-22 17:28:45 +0000

Ecco una soluzione per tutti i file batch (una variante della mia altra risposta) che zipperà un file chiamato c:\ue_english.txt e lo inserirà in C:\someArchive.zip:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript _zipIt.vbs %TEMPDIR% C:\someArchive.zip

pause

L'accesso in scrittura è richiesto al genitore della cartella memorizzata in TEMPDIR. Poiché questo spesso non è il caso della radice del drive C TEMPDIR potrebbe dover essere cambiato.

L'accesso in scrittura è richiesto anche per la cartella in cui si trova lo script .bat (in quanto vi genera un file).

Inoltre, si prega di notare che l'estensione del file compresso deve essere .zip. I tentativi di utilizzare un'altra estensione possono causare un errore di script. Invece, generare il file .zip e rinominarlo.

40
40
40
2010-02-20 15:48:33 +0000

E’ è possibile zippare i file senza installare alcun software aggiuntivo (l'ho testato). La soluzione è:

Esegui questo in una finestra a riga di comando per creare un file ZIP denominato C:\someArchive.zip contenente tutti i file nella cartella C:\test3:

CScript zip.vbs C:\test3 C:\someArchive.zip

dove il file zip.vbs contiene:

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an 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 to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

Non l'ho testato per i percorsi e i nomi dei file contenenti spazi. Può funzionare se si mettono le virgolette intorno ai parametri della riga di comando.


Come funziona: la funzionalità zip integrata in Windows (Windows XP e successivi?) è esposta attraverso le interfacce COM dalla shell di Windows, explorer.exe - che è la parte “Shell.Application”. Questa interfaccia COM può essere usata da uno script VBScript perché tale script può accedere ai componenti COM. Per rendere lo script completamente autonomo crea un file ZIP vuoto per iniziare (si potrebbe anche creare un file ZIP vuoto e copiarlo nel sistema di destinazione insieme allo script VBScript).

VBScript è stato installato di default in ogni versione desktop di Microsoft Windows a partire da Windows 98.

CScript.exe fa parte di Windows Script Host . Windows Script Host è distribuito e installato di default su Windows 98 e versioni successive di Windows. Viene installato anche se è installato Internet Explorer 5 (o una versione successiva).

12
12
12
2010-02-19 21:59:36 +0000

Se si è aperti all'utilizzo di * PowerShell **, le funzionalità zip sono disponibili in .NET 2.0 (PowerShell è .NET). Ecco un esempio source ) credito a Mike Hodnick:

########################################################
# out-zip.ps1
#
# Usage:
# To zip up some files:
# ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
# To zip up a folder:
# gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}
7
7
7
2011-11-23 00:47:36 +0000

È possibile eliminare il rischio di timeout durante la compressione attraverso il polling per l'esistenza della finestra di dialogo di compressione. Questo metodo gestisce anche la cancellazione dell'utente dalla finestra di compressione.

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop
5
5
5
2010-02-19 20:29:14 +0000

Se siete in grado di installare il Resource Kit Tools , troverete uno strumento a riga di comando chiamato COMPRESS che può creare file di archivio compressi come zip.

Microsoft (R) File Compression Utility Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999. All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r Rename compressed files.
  -d Update compressed files only if out of date.
  -zx LZX compression.
  -z MS-ZIP compression.
  -zq[n] Quantum compression and optional level
                (in range 1-7, default is 4).
  Source Source file specification. Wildcards may be used.
  Destination Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.
3
3
3
2012-08-07 07:46:33 +0000
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop
2
2
2
2017-06-07 21:53:59 +0000

Questa è una mutazione della risposta accettata. Faccio un sacco di compiti di automazione su un massimo di migliaia di file alla volta, quindi non posso semplicemente dormire per 2 secondi e non me ne frega niente. Ho trovato il workaround qui , che è anche simile alla risposta di Jiří Kočara qui .

Questo farà sì che la cartella di destinazione venga pingata ogni 200ms, che è approssimativamente veloce come dice Microsoft per controllare gli aggiornamenti di FS.

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop
2
2
2
2012-11-05 21:06:59 +0000

Più file / directory con codice semplificato.

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

file zip.vbs

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next
1
1
1
2015-01-22 12:31:49 +0000

Ecco il mio tentativo di riassumere le capacità integrate delle finestre per la compressione e la decompressione - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f (https://github.com/npocmaka/batch.scripts/blob/master/hybrids/jscript/zipjs.bat)

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

Per quanto riguarda il shell.application e WSH ho preferito il [ jscript ]&003 in quanto permette un file ibrido batch/jscript (con estensione .bat) che non richiede file temporanei.Ho messo le capacità di unzip e zip in un unico file più alcune altre caratteristiche.

1
1
1
2019-08-20 13:24:16 +0000

Windows 10 build 17063 o successivo è fornito in bundle con tar.exe che è in grado di lavorare con zip dalla linea di comando.

tar.exe -xf archive.zip

o di creare un archivio

tar.exe -cf Test.zip Test
1
1
1
2016-08-02 11:19:52 +0000

Se su Windows 8 o Windows Server 2012 avrete PowerShell e .NET 4.5 in modo da poterlo fare:

zip.ps1 (utilizzo: -directory <directory to zip up> -name <zip name>):

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (se avete bisogno di un helper per chiamare PowerShell per voi, la directory è il primo argomento e il nome zip il secondo):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
-4
-4
-4
2013-05-31 19:54:34 +0000

La riga di comando di Windows fornisce ora il comando compatto che, per quanto ne so, è nativo di Windows. Questo dovrebbe soddisfare i requisiti richiesti, a meno che non mi sia sfuggito qualcosa.