为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2019-06-19 16:27:38
如何在不使用任何外部工具的情况下用批处理文件压缩(/zip)和解压缩(/解压缩)文件和文件夹?我知道这里问了很多类似的问题,但我对答案并不完全满意(甚至对问题也不满意)。其主要目标是兼容性-它应该适用于尽可能广泛的Windows机器(包括XP、Vista、Win 2003),这些机器仍然拥有大约20%的Windows份额,生成的文件应该可以在Unix/Mac机器上使用(因此最好采用标准存档/压缩格式)。备选方案是:创建一个实现某些zip算法的批处理。很明显,这是可能的-但只对单个文件使用CERTUTIL进行二进制处理(一些机器默认没有CERTUTIL,并且无法在WinXP家庭版上安装)使用壳类应用通过WSH。我认为这是最好的选择。它允许压缩整个目录,并且可以在每台windows机器上使用。马凯卡尽管压缩不是那么便携,但它在每台Windows机器上都是可用的。像7zip这样的外部程序能够提取.cab内容,但是当文件需要在Unix/Mac上使用时,它就不那么方便了。虽然压缩单个文件非常简单,但是保持目录结构需要付出更多的努力。使用.NET框架-不是很好的选择。GZipStream但它只允许对单个文件进行压缩。.NET 4.5具有Zip功能,但它在Vista和XP上不受支持。更重要的是,在XP和Win 2003上没有默认安装.NET,但由于.NET 2.0升级到4.0的可能性很大,这是一个相当大的问题。Powershell-由于它依赖于.NET,它具有相同的能力,在XP、2003和Vista上默认情况下没有安装,所以我将跳过它。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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 ;;;;;


查看完整回答
反对 回复 2019-06-19
?
绝地无双

TA贡献1946条经验 获得超4个赞

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 menu

if not exist "%APPDATA%\Microsoft\Windows\SendTo\CAB.bat" copy /y "%~f0" "%APPDATA%\Microsoft\Windows\SendTo\CAB.bat" >nul 2>nul

ping -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 enabledelayedexpansion

pushd "%~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


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 1452 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信