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

Pouvez-vous zipper un fichier à partir de l'invite de commande en utilisant UNIQUEMENT la capacité intégrée de Windows de zipper des fichiers ?

J'ai un fichier batch qui produit un fichier texte. J'ai pensé que ce serait bien si je pouvais le zipper aussi.

Il sera utilisé dans un environnement non contrôlé, je ne peux donc pas faire de suppositions sur la présence de logiciels tiers tels que 7-Zip , etc. Il faut pour cela utiliser la capacité désormais intégrée de Windows de zipper les fichiers.

Réponses (12)

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

Voici une solution de fichier tout en lot (une variation de mon autre réponse) qui zippera un fichier nommé c:\ue_english.txt et le mettra dans 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

Un accès en écriture est nécessaire au parent du dossier stocké dans TEMPDIR. Comme ce n'est souvent pas le cas pour la racine du lecteur C TEMPDIR peut devoir être modifiée.

L'accès en écriture est également nécessaire pour le dossier dans lequel se trouve le script .bat (car il y génère un fichier).

Veuillez également noter que l'extension du fichier compressé doit être .zip. Toute tentative d'utiliser une autre extension peut entraîner une erreur de script. Générez plutôt le fichier .zip et renommez-le.

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

Il est possible de zipper des fichiers sans installer de logiciel supplémentaire (je l'ai testé). La solution est la suivante :

Exécuter ceci dans une fenêtre de ligne de commande pour créer un fichier ZIP nommé C:\someArchive.zip contenant tous les fichiers du dossier C:\test3 :

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

Où le fichier zip.vbs contient :

' 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

Je n'ai pas testé les chemins d'accès et les noms de fichiers contenant des espaces. Cela peut fonctionner si des guillemets sont placés autour des paramètres de la ligne de commande.


Comment ça marche : la fonctionnalité zip intégrée dans Windows (Windows XP et ultérieur ?) est exposée à travers les interfaces COM du shell Windows, explorer.exe - c'est-à-dire la partie “Shell.Application”. Cette interface COM peut être utilisée à partir d'un script VBScript car un tel script peut accéder aux composants COM. Pour que le script soit totalement autonome, il crée un fichier ZIP vide pour démarrer (on peut aussi créer un fichier ZIP vide et le copier sur le système cible avec le script VBScript).

VBScript a été installé par défaut dans chaque version de Microsoft Windows depuis Windows 98.

CScript.exe fait partie de Windows Script Host . Windows Script Host est distribué et installé par défaut sur Windows 98 et les versions ultérieures de Windows. Il est également installé si Internet Explorer 5 (ou une version ultérieure) est installé.

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

Si vous êtes ouvert à l'utilisation de * PowerShell **, les capacités de zip sont disponibles en .NET 2.0 (PowerShell est .NET). Voici un exemple source ) crédit à 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

Vous pouvez éliminer le risque de dépassement de délai pendant la compression en interrogeant l'existence de la fenêtre de dialogue de compression. Cette méthode gère également l'annulation par l'utilisateur de la fenêtre de compression.

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

Si vous êtes en mesure d'installer les Outils du kit de ressources , vous trouverez un outil en ligne de commande appelé COMPRESS qui peut créer des fichiers d'archive compressés comme 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

Il s'agit d'une mutation de la réponse acceptée. Je fais une tonne de tâches d'automatisation sur des milliers de fichiers à la fois, donc je ne peux pas simplement dormir pendant 2 secondes et ne pas m'en soucier. J'ai glané la solution ici , qui est également similaire à la réponse de Jiří Kočara ici .

Le dossier de destination sera ainsi interrogé par ping toutes les 200 ms, ce qui est à peu près aussi rapide que ce que Microsoft dit pour vérifier les mises à jour de 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

Fichiers / répertoires multiples avec code simplifié.

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

fichier 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

Voici ma tentative de résumer les capacités intégrées des fenêtres pour la compression et la décompression - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

avec quelques solutions données qui devraient fonctionner sur presque toutes les machines Windows.

En ce qui concerne shell.application et WSH, j'ai préféré le jscript car il permet un fichier hybride batch/jscript (avec l'extension .bat) qui ne nécessite pas de fichiers temporaires.

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

Windows 10 build 17063 ou plus récent est livré avec tar.exe qui est capable de travailler avec zip depuis la ligne de commande.

tar.exe -xf archive.zip

ou pour créer des archives

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

Si vous êtes sous Windows 8 ou Windows Server 2012, vous aurez PowerShell et .NET 4.5, vous pouvez donc faire ceci :

zip.ps1 (utilisation : -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 (si vous avez besoin d'une aide pour appeler PowerShell pour vous, le répertoire est le premier argument et le nom du zip le second) :

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

La ligne de commande Windows fournit maintenant la commande compacte qui, pour autant que je sache, est native de Windows. Cela devrait répondre aux exigences demandées, à moins que j'aie manqué quelque chose.