如何在不使用任何外部工具的情况下用批处理文件压缩(/zip)和解压缩(/解压缩)文件和文件夹?

如何在不使用任何外部工具的情况下用批处理文件压缩(/zip)和解压缩(/解压缩)文件和文件夹?

我知道这里问了很多类似的问题,但我对答案并不完全满意(甚至对问题也不满意)。

其主要目标是兼容性-它应该适用于尽可能广泛的Windows机器(包括XP、Vista、Win 2003),这些机器仍然拥有大约20%的Windows份额,生成的文件应该可以在Unix/Mac机器上使用(因此最好采用标准存档/压缩格式)。

备选方案是:

  1. 创建一个实现某些zip算法的批处理。很明显,这是可能的-但只对单个文件使用CERTUTIL进行二进制处理(一些机器默认没有CERTUTIL,并且无法在WinXP家庭版上安装)
  2. 使用

    壳类应用

    通过WSH。我认为这是最好的选择。它允许压缩整个目录,并且可以在每台windows机器上使用。
  3. 马凯卡

    尽管压缩不是那么便携,但它在每台Windows机器上都是可用的。像7zip这样的外部程序能够提取.cab内容,但是当文件需要在Unix/Mac上使用时,它就不那么方便了。虽然压缩单个文件非常简单,但是保持目录结构需要付出更多的努力。
  4. 使用.NET框架-不是很好的选择。

    GZipStream

    但它只允许对单个文件进行压缩。.NET 4.5具有Zip功能,但它在Vista和XP上不受支持。更重要的是,在XP和Win 2003上没有默认安装.NET,但由于.NET 2.0升级到4.0的可能性很大,这是一个相当大的问题。
  5. Powershell-由于它依赖于.NET,它具有相同的能力,在XP、2003和Vista上默认情况下没有安装,所以我将跳过它。


牛魔王的故事
浏览 1454回答 3
3回答

慕的地8271018

makecab解决方案有一些问题,所以这里有一个固定版本,当使用带空格的目录时,它解决了这个问题。;@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 ;;;;;

绝地无双

CAB.bat[INPUT]文件夹或文件:PACKIN.CAB或.?_:解压缩\None:Pack afiles子文件夹还将添加CAB右键单击“发送到”菜单以便于处理。由于这两个任务都是无缝完成的,所以它应该比丑陋的makecabOne更好-如果您编写临时文件,为什么要使用混合脚本呢?@echo off &echo. &set "ext=%~x1" &title CAB [%1] &rem input file or folder / 'files' folder / unpacks .cab .??_if "_%1"=="_" if not exist "%~dp0files" echo CAB: No input and no 'files' directory to pack &goto :Exit "do nothing"if "_%1"=="_" if exist "%~dp0files" call :CabDir "%~dp0files" &goto :Exit "input = none, use 'files' directory -pack" for /f "tokens=1 delims=r-" %%I in ("%~a1") do if "_%%I"=="_d" call :CabDir "%~f1" &goto :Exit "input = dir -pack"if not "_%~x1"=="_.cab" if not "_%ext:~-1%"=="__" call :CabFile "%~f1" &goto :Exit "input = file -pack"call :CabExtract "%~f1" &goto :Exit "input = .cab or .??_ -unpack" :Exit AveYo: script will add a CAB entry to right-click -- SendTo menuif not exist "%APPDATA%\Microsoft\Windows\SendTo\CAB.bat" copy /y "%~f0" "%APPDATA%\Microsoft\Windows\SendTo\CAB.bat" >nul 2>nulping -n 6 localhost >nul &title cmd.exe &exit /b:CabExtract %1:[.cab or .xx_]echo %1 &pushd "%~dp1" &mkdir "%~n1" >nul 2>nul &expand -R "%~1" -F:* "%~n1" &popd &goto :eof:CabFile %1:[filename]echo %1 &pushd "%~dp1" &makecab /D CompressionType=LZX /D CompressionLevel=7 /D CompressionMemory=21 "%~nx1" "%~n1.cab" &goto :eof   :CabDir %1:[directory]dir /a:-D/b/s "%~1"set "ddf="%temp%\ddf""echo/.New Cabinet>%ddf%echo/.set Cabinet=ON>>%ddf%echo/.set CabinetFileCountThreshold=0;>>%ddf%echo/.set Compress=ON>>%ddf%echo/.set CompressionType=LZX>>%ddf%echo/.set CompressionLevel=7;>>%ddf%echo/.set CompressionMemory=21;>>%ddf%echo/.set FolderFileCountThreshold=0;>>%ddf%echo/.set FolderSizeThreshold=0;>>%ddf%echo/.set GenerateInf=OFF>>%ddf%echo/.set InfFileName=nul>>%ddf%echo/.set MaxCabinetSize=0;>>%ddf%echo/.set MaxDiskFileCount=0;>>%ddf%echo/.set MaxDiskSize=0;>>%ddf%echo/.set MaxErrors=1;>>%ddf%echo/.set RptFileName=nul>>%ddf%echo/.set UniqueFiles=ON>>%ddf%setlocal enabledelayedexpansionpushd "%~dp1"for /f "tokens=* delims=" %%D in ('dir /a:-D/b/s "%~1"') do ( set "DestinationDir=%%~dpD" &set "DestinationDir=!DestinationDir:%~1=!" &set "DestinationDir=!DestinationDir:~0,-1!" echo/.Set DestinationDir=!DestinationDir!;>>%ddf% echo/"%%~fD"  /inf=no;>>%ddf%)makecab /F %ddf% /D DiskDirectory1="" /D CabinetNameTemplate=%~nx1.cab &endlocal &popd &del /q /f %ddf% &goto :eof
打开App,查看更多内容
随时随地看视频慕课网APP