Guest User

cabMaker.cmd v0.3 - Create and distribute archives using Windows native apps

a guest
May 29th, 2026
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 5.23 KB | Source Code | 0 0
  1. ::-------------------------------------------------------------------------------
  2. :cabMaker [/Cn /Kn /Fn] source\folder[\file] [destination\folder]          v0.3
  3. ::
  4. ::  Generates .CAB or self-extracting batch script from a source file or folder
  5. ::  using MakeCab + Expand/Extract (compression) + CertUtil (Base64 encoding).
  6. ::
  7. ::  /Cn compression 0=default=make both and keep smallest, 1=MSZIP, 2=LZX
  8. ::  /Kn keepSrcDir  0=default=ignore folder, 1=retain source folder in archive
  9. ::  /Fn fileType    0=default=make archive.cab, 1=make self-extracting.cmd
  10. ::-------------------------------------------------------------------------------
  11. ::
  12. :: v0.3
  13. :: Corrected extraction to use Extract/Extrac32 if installed version of
  14. :: Expand is lower than 6.x, as previous versions ignore paths in CABs.
  15. :: Cleaned up 'best compression' code just a bit by removing redundancies.
  16. ::
  17. :: v0.2
  18. :: Added commandline options, auto-choose MSZIP/LZX best compression,
  19. :: and improved the MakeCab.ddf settings.
  20. ::
  21. :: CirothUngol 2018/11/07
  22. @ECHO OFF
  23. SETLOCAL EnableExtensions EnableDelayedExpansion
  24. SET "compression=0"   ' 0=make both and keep smallest, 1=MSZIP, 2=LZX
  25. SET "keepSrcDir=0"    ' 0=ignore folder, 1=retain source folder in archive
  26. SET "fileType=0"      ' 0=make archive.cab, 1=make self-extracting.cmd
  27. SET "targetDir=%~dp0" ' default destination folder for creating files
  28. SET "SELF=%~f0"
  29.  
  30. :cabMaker_parse
  31. :: /Cn /Kn /Fn else shift and ignore
  32. SET "par=%~1"
  33. IF /I "!par:~0,1!"=="/" ( SHIFT
  34.     IF /I "!par:~1,1!"=="C" SET /A "compression=!par:~2!" 2>NUL
  35.     IF /I "!par:~1,1!"=="K" SET /A "keepSrcDir=!par:~2!" 2>NUL
  36.     IF /I "!par:~1,1!"=="F" SET /A "fileType=!par:~2!" 2>NUL
  37.     GOTO :cabMaker_parse
  38. )
  39.  
  40. :: exit if no input, input doesn't exist, or file count=0
  41. SET count=0
  42. IF NOT EXIST "%~1" GOTO :cabMaker_help
  43. FOR /F %%A IN ('DIR /B "%~f1" 2^>NUL') DO SET /A "count+=1"
  44. IF %count% EQU 0 GOTO :cabMaker_help
  45.  
  46. :: get full path to source/target
  47. FOR %%A IN ("%~1") DO SET "source=%%~fA" & SET "sPath=%%~pnxA" & SET "cabName=%%~nxA"
  48. FOR %%A IN ("%~2") DO SET "target=%%~fA"
  49. IF NOT DEFINED target SET "target=!targetDir!"
  50. MD "!target!" 2>NUL
  51. IF %keepSrcDir% EQU 0 (SET "destDir=") ELSE SET "destDir=!cabName!"
  52.  
  53. :: Add the header to the cabinet config file
  54. IF %compression% LEQ 1 (SET "ct=MSZIP") ELSE SET "ct=LZX"
  55. SET "targetFile=!target!\!cabName!"
  56. >"!targetFile!.ddf" (
  57.     ECHO(; Generated on %DATE% at %TIME: =0%
  58.     ECHO(.New Cabinet
  59.     ECHO(.Set CabinetNameTemplate="!cabName!.cab"
  60.     ECHO(.Set DiskDirectoryTemplate="!target!"
  61.     ECHO(.Set GenerateInf=OFF
  62.     ECHO(.Set Cabinet=ON
  63.     ECHO(.Set Compress=ON
  64.     ECHO(.Set UniqueFiles=ON
  65.     ECHO(.Set MaxDiskSize=1215751680
  66.     ECHO(.Set RptFileName=NUL
  67.     ECHO(.Set InfFileName=NUL
  68.     ECHO(.Set MaxErrors=1
  69.     ECHO(.Set CompressionMemory=21
  70. )
  71.  
  72. :: if source is folder add files iteratively
  73. IF EXIST "!source!\" (
  74.     FOR /D /R "%source%" %%A IN (*) DO (
  75.         SET "tDir=%%~pnxA"
  76.         SET "dDir=!destDir!!tDir:%sPath%=!"
  77.         ECHO(Adding "!cabName!!tDir:%sPath%=!"
  78.         ECHO(.Set DestinationDir=!dDir!>>"!targetFile!.ddf"
  79.         FOR %%B IN ("%%A\*") DO ECHO("%%~fB"  /inf=no>>"!targetFile!.ddf"
  80.     )
  81.     ECHO(Adding "!cabName!"
  82.     ECHO(.Set DestinationDir=!destDir!>>"!targetFile!.ddf"
  83.     FOR %%A IN ("!source!\*") DO ECHO("%%~fA"  /inf=no>>"!targetFile!.ddf"
  84.     ECHO(
  85. ) ELSE ECHO("!source!"  /inf=no>>"!targetFile!.ddf"
  86. ECHO(CompressionType=!ct!
  87. MakeCab /D CompressionType=!ct! /F "!targetFile!.ddf"
  88.  
  89. :: second compression
  90. IF %compression% LEQ 0 ( ECHO(
  91.     ECHO(CompressionType=LZX
  92.     REN "!targetFile!.cab" "!cabName!.zip.cab"
  93.     MakeCab /D CompressionType=LZX /F "!targetFile!.ddf"
  94.     FOR %%A IN ("!targetFile!.cab") DO FOR %%B IN ("!targetFile!.zip.cab") DO (
  95.         IF %%~zA GEQ %%~zB ( DEL /F /A "!targetFile!.cab"
  96.             REN "!targetFile!.zip.cab" "!cabName!.cab"
  97.         ) ELSE SET "ct=LZX" & DEL /F /A "!targetFile!.zip.cab"
  98.     )
  99.     ECHO(
  100.     ECHO(Keeping !ct!
  101. )
  102. DEL /F /A "!targetFile!.ddf"
  103. IF %fileType% EQU 0 ENDLOCAL & EXIT /B 0
  104.  
  105. :: Generate self-extracting script
  106. ECHO(
  107. CertUtil /encode "!targetFile!.cab" "!targetFile!.b64"
  108. >"!targetFile!.b64.cmd" (
  109.     ECHO(:: !cabName!.b64.cmd [target\folder] [noExpand]
  110.     ECHO(:: ErrorLevel: 0=success, 1=no CertUtil install Administration Tools
  111.     ECHO(@ECHO OFF
  112.     ECHO(FOR /F "tokens=3-12" %%%%A IN ^('Expand'^) DO ^(
  113.     ECHO(   SETLOCAL EnableExtensions EnableDelayedExpansion
  114.     ECHO(   SET "fn=!cabName!.cab"
  115.     ECHO(   IF "%%~1"=="" ^(SET "tf=%%~dp0"^) ELSE SET "tf=%%~1" ^& MD "%%~1"
  116.     ECHO(   IF "^!tf:~-1^!"=="\" SET "tf=^!tf:~0,-1^!"
  117.     ECHO(   CertUtil -decode -f "%%~f0" "^!TEMP^!\^!fn^!"
  118.     ECHO(   IF ^^!ERRORLEVEL^^!==9009 ENDLOCAL ^& EXIT /B 1
  119.     ECHO(   IF "%%~2"=="" ^(SET /A "ev=%%%%J%%%%I%%%%H%%%%G%%%%F%%%%E%%%%D%%%%C%%%%B%%%%A"
  120.     ECHO(       IF ^^!ev^^! GEQ 6 ^(Expand -R "^!TEMP^!\^!fn^!" -F:* "^!tf^!"
  121.     ECHO(       ^) ELSE Extract /Y /E /L "^!tf^!" "^!TEMP^!\^!fn^!"
  122.     ECHO(       IF ^^!ERRORLEVEL^^!==9009 START "" /MIN /WAIT Extrac32 /Y /E /L "^!tf^!" "^!TEMP^!\^!fn^!"
  123.     ECHO(       IF ^^!ERRORLEVEL^^!==0 DEL /F /A "^!TEMP^!\^!fn^!"^)
  124.     ECHO(   MOVE /Y "^!TEMP^!\^!fn^!" "^!tf^!" ^& RD "%%~1"
  125.     ECHO(   ENDLOCAL ^& EXIT /B 0^) ^>NUL 2^>^&1
  126.     TYPE "!targetFile!.b64"
  127. )
  128. DEL /F /A "!targetFile!.cab" "!targetFile!.b64"
  129. ENDLOCAL & EXIT /B 0
  130.  
  131. :cabMaker_help
  132. FOR /F "usebackq tokens=* delims=:" %%A IN ("%SELF%") DO IF "%%A" NEQ "" (ECHO(%%A) ELSE ENDLOCAL & EXIT /B 0
  133.  
Tags: batch
Add Comment
Please, Sign In to add comment