125 votos

Se puede comprimir un archivo desde la línea de comandos usando SÓLO Windows' capacidad incorporada de archivos zip?

Tengo un archivo de proceso por lotes que genera un archivo de texto. Pensé que sería bueno si pudiera comprimir demasiado.

Este será utilizado en un ambiente controlado, por lo que no puede hacer suposiciones acerca de la presencia de productos de software de terceros tales como 7-Zip, etc. Esto tiene que usar Windows, que ahora integrada en la capacidad para archivos zip.

93voto

Adam V Puntos 2774

Aquí es un archivo de proceso por lotes de solución (una variación de mi otra respuesta) que se zip un archivo con el nombre c:\ue_english.txt y la puso en 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

Escribir es necesario el acceso a los padres de la carpeta guardada en TEMPDIR. Como esto es a menudo no es el caso de la root de la unidad C TEMPDIR puede tener que ser cambiado.

El acceso de escritura también es necesario para la carpeta de la .bat script (como se genera un archivo de allí).

También, por favor, tenga en cuenta que la extensión de archivo para el archivo comprimido debe ser .zip. Intenta utilizar otra extensión puede resultar en un error de secuencia de comandos. En su lugar, generar la .zip archivo y cambiarle el nombre.

41voto

Adam V Puntos 2774

Esto es posible para los archivos zip sin necesidad de instalación adicional alguno el software (lo he probado). La solución es:

Ejecutar esto en una ventana de línea de comandos para crear un archivo zip nombre C:\someArchive.zip que contiene todos los archivos en la carpeta C:\test3:

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

Donde archivo zip.vbs contiene:

'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

Yo no lo he probado para las rutas y nombres de archivo contiene espacios. Es posible que funcione si las comillas se colocan alrededor de los parámetros de línea de comandos.


Cómo funciona: la incorporada en el zip de la funcionalidad en Windows (Windows XP y versiones posteriores?) es se exponen a través de COM interfaces desde el shell de Windows , explorer.exe - que es el "Shell.Aplicación". Esta interfaz COM que puede ser utilizado desde un VBScript script porque una secuencia de comandos puede acceder a los componentes COM. Para hacer que el script totalmente autónomo que crea vacío de un archivo ZIP para empezar (también se podría crear un vacío archivo ZIP y copiarlo en el sistema de destino junto con la secuencia de comandos de VBScript).

VBScript ha sido instalado por defecto en todos los escritorios lanzamiento de Microsoft Windows desde Windows 98.

CScript.exe es parte de Windows Script Host. Windows Script Host se distribuye y se instala por defecto en Windows 98 y versiones posteriores de Windows. También se instala si Internet Explorer 5 (o una versión posterior) está instalado.

12voto

Philip Durbin Puntos 676

Si usted está abierto para el uso de PowerShell, código postal capacidades están disponibles en .NET 2.0 (PowerShell es .NET). He aquí un ejemplo (fuente) crédito 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)}

7voto

George Yockey Puntos 69

Usted puede eliminar el riesgo de que se agote el tiempo de espera durante la compresión de la votación para la existencia de la compresión de la ventana de diálogo. Este método también se encarga del usuario de la cancelación de la compresión de la ventana.

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

5voto

matdumsa Puntos 6779

Si usted es capaz de instalar las Herramientas del Kit de Recursos, usted encontrará una herramienta de línea de comandos llamada COMPRIMIR, lo que puede crear comprimido de archivos comprimidos como 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.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: