Und hier sind die Antwort (en):
1.Using "reine" Batch-Skript, zip/unzip Datei.
Es ist möglich, dank Frank Westlake ZIP.CMD und UNZIP.CMD (benötigt Admin-Berechtigungen und erfordert FSUTIL
und CERTUTIL
) .Für Win2003 und WinXP es 2003 Admin Tool Pack erfordert die CERTUTIL
installieren. Seien Sie vorsichtig, da die ZIP.CMD-Syntax rückwärts ist:
ZIP.CMD destination.zip source.file
Und es kann nur einzelne Dateien zippen.
2.Using Shell.Application
Ich habe einige Zeit damit verbracht eine einzelne jscript/Batch-Hybrid-Skript für die gemeinsame Nutzung zu erstellen, die Reißverschlüsse/dekomprimiert Dateien und Verzeichnisse (plus einige weitere Merkmale).Here's a link to it (es wurde zu groß, um in der Antwort zu posten). Kann direkt mit der Erweiterung .bat
verwendet werden und erstellt keine temporären Dateien. Ich hoffe, die Hilfe Nachricht ist beschreibend genug, wie es verwendet werden kann.
Einige Beispiele:
// unzip content of a zip to given folder.content of the zip will be not preserved (-keep no).Destination will be not overwritten (-force no)
call zipjs.bat unzip -source C:\myDir\myZip.zip -destination C:\MyDir -keep no -force no
// lists content of a zip file and full paths will be printed (-flat yes)
call zipjs.bat list -source C:\myZip.zip\inZipDir -flat yes
// lists content of a zip file and the content will be list as a tree (-flat no)
call zipjs.bat list -source C:\myZip.zip -flat no
// prints uncompressed size in bytes
zipjs.bat getSize -source C:\myZip.zip
// zips content of folder without the folder itself
call zipjs.bat zipDirItems -source C:\myDir\ -destination C:\MyZip.zip -keep yes -force no
// zips file or a folder (with the folder itslelf)
call zipjs.bat zipItem -source C:\myDir\myFile.txt -destination C:\MyZip.zip -keep yes -force no
// unzips only part of the zip with given path inside
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir\InzipFile -destination C:\OtherDir -keep no -force yes
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir -destination C:\OtherDir
// adds content to a zip file
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip\InzipDir -keep no
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip
einige bekannte Probleme bei zippen:
- , wenn es auf dem Systemlaufwerk (in der Regel C :) das Skript verschiedene Fehler erzeugen könnte, meist nicht genug Platz ist der Skript hält an.Dies liegt an Shell.Application aktiv verwendet % TEMP% Ordner zum Komprimieren/Dekomprimieren der Daten.
- Ordner und Dateien, die Unicode-Symbole in ihren Namen enthalten, können nicht vom Shell.Application-Objekt verarbeitet werden.
- Max unterstützte Größe der produzierten Zip-Dateien um 8gb in Vista ist und über und um 2gb in XP/2003
Das Skript erkennt, wenn Fehlermeldung-up öffnet und stoppt die Ausführung und informiert für die möglichen Gründe. Im Moment habe ich keine Möglichkeit, den Text im Pop-up zu erkennen und den genauen Grund für den Fehler anzugeben.
3. Makecab.
Komprimieren einer Datei ist einfach - makecab file.txt "file.cab"
. Schließlich könnte MaxCabinetSize erhöht werden. Komprimieren eines Ordners erfordert eine Verwendung DestinationDir Direktive (mit relativen Pfaden) für jedes (Unter) Verzeichnis und die darin enthaltenen Dateien. Hier ist ein Skript:
;@echo off
;;;;; rem start of the batch part ;;;;;
;
;for %%a in (/h /help -h -help) do (
; if /I "%~1" equ "%%~a" if "%~2" equ "" (
; echo compressing directory to cab file
; echo Usage:
; echo(
; echo %~nx0 "directory" "cabfile"
; echo(
; echo to uncompress use:
; echo EXPAND cabfile -F:* .
; echo(
; echo Example:
; echo(
; echo %~nx0 "c:\directory\logs" "logs"
; exit /b 0
; )
;)
;
; if "%~2" EQU "" (
; echo invalid arguments.For help use:
; echo %~nx0 /h
; exit /b 1
;)
;
; set "dir_to_cab=%~f1"
;
; set "path_to_dir=%~pn1"
; set "dir_name=%~n1"
; set "drive_of_dir=%~d1"
; set "cab_file=%~2"
;
; if not exist %dir_to_cab%\ (
; echo no valid directory passed
; exit /b 1
;)
;
;break>"%tmp%\makecab.dir.ddf"
;
;setlocal enableDelayedExpansion
;for /d /r "%dir_to_cab%" %%a in (*) do (
;
; set "_dir=%%~pna"
; set "destdir=%dir_name%!_dir:%path_to_dir%=!"
; (echo(.Set DestinationDir=!destdir!>>"%tmp%\makecab.dir.ddf")
; for %%# in ("%%a\*") do (
; (echo("%%~f#" /inf=no>>"%tmp%\makecab.dir.ddf")
; )
;)
;(echo(.Set DestinationDir=!dir_name!>>"%tmp%\makecab.dir.ddf")
; for %%# in ("%~f1\*") do (
;
; (echo("%%~f#" /inf=no>>"%tmp%\makecab.dir.ddf")
; )
;makecab /F "%~f0" /f "%tmp%\makecab.dir.ddf" /d DiskDirectory1=%cd% /d CabinetNameTemplate=%cab_file%.cab
;rem del /q /f "%tmp%\makecab.dir.ddf"
;exit /b %errorlevel%
;;
;;;; rem end of the batch part ;;;;;
;;;; directives part ;;;;;
;;
.New Cabinet
.set GenerateInf=OFF
.Set Cabinet=ON
.Set Compress=ON
.Set UniqueFiles=ON
.Set MaxDiskSize=1215751680;
.set RptFileName=nul
.set InfFileName=nul
.set MaxErrors=1
;;
;;;; end of directives part ;;;;;
Für Dekompression EXPAND cabfile -F:* .
used.For Extraktion in Unix cabextract sein kann oder 7zip verwendet werden.
4. .NET und GZipStream
zog ich eine Jscript.net wie es eine ordentliche Hybridisierung mit .bat erlaubt (keine toxischen Ausgang und keine temporären Dateien) .Jscript erlauben keine Referenz von vorbei Objekt zu einer Funktion, so die einzige Weise, die ich gefunden habe, um es arbeiten zu lassen, ist by byte by byte lesen/schreiben (also nehme ich an, es ist nicht der schnellste Weg - wie gepuffertes Lesen/Schreiben kann getan werden?) Wieder kann nur mit Single verwendet werden Dateien.
@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
set "jsc=%%v"
)
if not exist "%~n0.exe" (
"%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)
%~n0.exe %*
endlocal & exit /b %errorlevel%
*/
import System;
import System.Collections.Generic;
import System.IO;
import System.IO.Compression;
function CompressFile(source,destination){
var sourceFile=File.OpenRead(source);
var destinationFile=File.Create(destination);
var output = new GZipStream(destinationFile,CompressionMode.Compress);
Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name,destinationFile.Name, false);
var byteR = sourceFile.ReadByte();
while(byteR !=- 1){
output.WriteByte(byteR);
byteR = sourceFile.ReadByte();
}
sourceFile.Close();
output.Flush();
output.Close();
destinationFile.Close();
}
function UncompressFile(source,destination){
var sourceFile=File.OpenRead(source);
var destinationFile=File.Create(destination);
var input = new GZipStream(sourceFile,
CompressionMode.Decompress, false);
Console.WriteLine("Decompressing {0} to {1}.", sourceFile.Name,
destinationFile.Name);
var byteR=input.ReadByte();
while(byteR !== -1){
destinationFile.WriteByte(byteR);
byteR=input.ReadByte();
}
destinationFile.Close();
input.Close();
}
var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
Console.WriteLine("Compress and uncompress gzip files:");
Console.WriteLine("Compress:");
Console.WriteLine(arguments[0]+" -c source destination");
Console.WriteLine("Uncompress:");
Console.WriteLine(arguments[0]+" -u source destination");
}
if (arguments.length!=4){
Console.WriteLine("Wrong arguments");
printHelp();
Environment.Exit(1);
}
switch (arguments[1]){
case "-c":
CompressFile(arguments[2],arguments[3]);
break;
case "-u":
UncompressFile(arguments[2],arguments[3]);
break;
default:
Console.WriteLine("Wrong arguments");
printHelp();
Environment.Exit(1);
}
Hat Ihre 'Shell.Application' Methode die [2GB Größenbeschränkung] (http://www.naterice.com/blog/template_permalink.asp?id=64)? Beachten Sie auch, dass das ZIP64-Format nur für 'Shell.Application' in [Vista oder neuer] (http://en.wikipedia.org/wiki/Zip_ (Dateiformat) # ZIP64) unterstützt wird. –
@DavidRuhmann - Die größte Datei, die ich getestet habe, war 1,5 GB. Höchstwahrscheinlich ist die Größe begrenzt. Testen Sie es und aktualisieren Sie es. – npocmaka
Ich habe gerade [meine »Shell.Application« -Lösung] (http://stackoverflow.com/a/27279354/1683264) getestet, die erfolgreich das Verzeichnis mit meiner virtuellen XP-Modus-Festplatte, die etwa 6,2 Gigs umfasst, komprimiert. Es komprimierte auf 2,44 Gigs. Ich habe dann IZArc zum Entpacken verwendet, und alle Inhalte wurden ohne Fehler mit Größen identisch mit den Originalen extrahiert. Dies ist auf Win7 x64. – rojo