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

Kun je een bestand zipen van de opdrachtprompt met behulp van de ingebouwde mogelijkheid van Windows om bestanden te zipen?

Ik heb een batch-bestand dat een tekstbestand uitvoert. Ik dacht dat het leuk zou zijn als ik het ook zou kunnen zipen.

Dit zal worden gebruikt in een ongecontroleerde omgeving, dus ik kan geen veronderstellingen maken over de aanwezigheid van softwareproducten van derden zoals 7-Zip , etc. Dit moet gebruik maken van de nu ingebouwde mogelijkheden van Windows om bestanden te zipen.

Antwoorden (12)

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

Hier is een all batch file oplossing (een variatie op mijn andere antwoord) die een bestand met de naam c:\ue_english.txt zal zipen en in C:\someArchive.zip zal zetten:

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

Schrijftoegang is vereist tot de ouder van de map die in TEMPDIR is opgeslagen. Omdat dit vaak niet het geval is voor de root van schijf C TEMPDIR kan het nodig zijn om deze te wijzigen.

Schrijftoegang is ook nodig voor de map waarin het .bat script zich bevindt (omdat het daar een bestand genereert).

Merk ook op dat de bestandsextensie voor het gecomprimeerde bestand .zip moet zijn. Pogingen om een andere extensie te gebruiken kan resulteren in een scriptfout. Genereer in plaats daarvan het .zip-bestand en hernoem het.

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

Het is is mogelijk om bestanden te zipen zonder installatie van extra software (ik heb het getest). De oplossing is:

Voer dit uit in een opdrachtregelvenster om een ZIP-bestand met de naam C:\someArchive.zip te maken dat alle bestanden in de map C:\test3 bevat:

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

Waar het bestand zip.vbs bevat:

' 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

heb ik het niet getest op paden en bestandsnamen die spaties bevatten. Het kan werken als aanhalingstekens rond de opdrachtregelparameters worden gezet.

  • *

Hoe het werkt: de ingebouwde zip-functionaliteit in Windows (Windows XP en later?) wordt belicht via COM interfaces van de Windows-shell, explorer.exe - dat is het “Shell.Application” gedeelte. Deze COM-interface kan worden gebruikt vanuit een VBScript -script, omdat een dergelijk script toegang heeft tot COM-onderdelen. Om het script volledig autonoom te maken, maakt het een leeg ZIP-bestand om aan de slag te gaan (men kan ook een leeg ZIP-bestand maken en dit samen met het VBScript-script naar het doelsysteem kopiëren).

VBScript is standaard geïnstalleerd in elke desktopversie van Microsoft Windows sinds Windows 98.

CScript.exe maakt deel uit van Windows Script Host . Windows Script Host wordt standaard gedistribueerd en geïnstalleerd op Windows 98 en latere versies van Windows. Het wordt ook geïnstalleerd als Internet Explorer 5 (of een latere versie) is geïnstalleerd.

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

Als u openstaat voor het gebruik van * PowerShell **, zijn er zip-mogelijkheden beschikbaar in .NET 2.0 (PowerShell is .NET). Hier is een voorbeeld bron ) credit to 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

U kunt het risico van time-out tijdens het comprimeren elimineren door te peilen naar het bestaan van het compressie-dialoogvenster. Deze methode behandelt ook de gebruiker die uit het compressie-venster annuleert.

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

Als u in staat bent om de Resource Kit Tools te installeren, vindt u een opdrachtregeltool genaamd COMPRESS die gecomprimeerde archiefbestanden zoals zip kan maken.

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

Dit is een mutatie van het geaccepteerde antwoord. Ik doe een ton aan automatiseringstaken op tot wel duizenden bestanden tegelijk, dus ik kan niet zomaar 2 seconden slapen en me er niets van aantrekken. Ik heb de workaround verzameld hier , die ook vergelijkbaar is met het antwoord van Jiří Kočara hier .

Dit zorgt ervoor dat de doelmap om de 200 ms wordt vastgepind, wat ongeveer net zo snel is als Microsoft zegt om te controleren op FS-updates.

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

Meerdere bestanden / mappen met vereenvoudigde code.

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

zip.vbs-bestand

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

Hier is een poging om de ingebouwde mogelijkheden van windows voor compressie en uncompressie samen te vatten - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

met een paar gegeven oplossingen die op bijna elke Windows machine zouden moeten werken.

Wat betreft de shell.application en WSH gaf ik de voorkeur aan de jscript omdat het een hybride batch/jscript bestand (met .bat extensie) mogelijk maakt die geen temp bestanden nodig heeft.Ik heb unzip en zip mogelijkheden in één bestand gezet plus een paar meer mogelijkheden.

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

Windows 10 build 17063 of later wordt gebundeld met tar.exe die met zip vanaf de commandoregel kan werken.

tar.exe -xf archive.zip

of om archief

tar.exe -cf Test.zip Test
``` te creëren.
1
1
1
2016-08-02 11:19:52 +0000

Als u op Windows 8 of Windows Server 2012 PowerShell en .NET 4.5 heeft, dan kunt u dit doen:

zip.ps1 (gebruik: -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 (als u een helper nodig heeft om PowerShell voor u te bellen, is de directory het eerste argument en de zip-naam het tweede):

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

De Windows commandoregel biedt nu de compacte opdracht die, voor zover ik kan zien, ingeburgerd is in Windows. Dat moet voldoen aan de gevraagde eisen, tenzij ik iets gemist heb.