- Сообщения
- 8,128
- Решения
- 23
- Реакции
- 6,920
Создание CAB-архива через командную строку
(в т.ч. самораспаковующихся EXE), а также распаковка CAB.
Автор: Alex Averchenkoff
Также перевод на VB6 от меня, созданный на основе кода от Alex Averchenkoff с правками от Dark_Timur.
(в т.ч. самораспаковующихся EXE), а также распаковка CAB.
Автор: Alex Averchenkoff
CMD/BATCH:
@echo **************************************************
@echo ((((((((((((((((((((((((((((((((((((((((((((((((((
@echo Name: CabMaker.exe
@echo Description: A program for creating cab archives
@echo Version: v. 1.0.0.0
@echo Copyright: @[USER=8310]Alex[/USER] Averchenkoff
@echo Create: 2011
@echo ))))))))))))))))))))))))))))))))))))))))))))))))))
@echo **************************************************
@echo off
set SaveName=""
rem ******************************************************
rem СТАРТОВЫЙ БЛОК - ВЫБИРАЕМ ДЕЙСТВИЕ:ПРОСМОТР\РАСПАКОВКА\СОЗДАНИЕ АРХИВА
rem ******************************************************
:start
echo.
set /p action=VIEW-1^|EXPAND-2^|CREATE-3:
if /i "%action%"=="1" (goto view)
if /i "%action%"=="2" (goto extract)
if /i "%action%"=="3" (goto create)
exit
rem ******************************************************
rem ПРОСМОТР CAB АРХИВА
rem ******************************************************
:view
set /p name=ENTER NAME ARCHIVE:
if "%SaveName%"=="" ( set SaveName=%name%)
if "%name%"=="" ( set name=%SaveName%)
if not "%name%"=="" (expand -D %name%.cab) else ( goto view)
if errorlevel 0 (goto action)
if errorlevel 1 (@echo An error occurred, try again)
rem ******************************************************
rem РАСПАКОВКА CAB АРХИВА - ФАЙЛЫ РАСПАКОВЫВАЮТСЯ В ДИРЕКТОРИЮ ОДНОИМЕННУЮ С ИМЕНЕМ АРХИВА
rem ******************************************************
:extract
set /p name=ENTER NAME ARCHIVE:
if "%SaveName%"=="" ( set SaveName=%name%)
if "%name%"=="" ( set name=%SaveName%)
if not "%name%"=="" (md "%~dp0%name%" && expand %name%.cab /F:* .\%name%) else ( goto extract)
if errorlevel 0 (@echo Archive successfully unzipped! & goto action)
if errorlevel 1 (@echo An error occurred, try again)
:action
echo You want to continue or exit the program?
set /p action=TO CONTINUE OR EXIT? [Y\N]:
if /i "%action%"=="Y" (goto start) else exit
rem ******************************************************
rem СОЗДАНИЕ НОВОГО CAB АРХИВА - СОЗДАЕТСЯ В ПАПКЕ РАСПОЛОЖЕНИЯ БАТНИКА
rem ******************************************************
:create
set /p name=ENTER NAME FOR ARCHIVE:
if "%SaveName%"=="" ( set SaveName=%name%)
if "%name%"=="" ( set name=%SaveName%)
if "%name%"=="" ( goto create)
rem ******************************************************
rem БУДЕМ ЛИ СОЗДАВАТЬ РАСПАКОВЫВАЮЩИЙСЯ АРХИВ
rem ******************************************************
set /p sfx=CREATE SFX?[Y\N]:
if /i "%sfx%"=="Y" (@echo Initiated the creation of self-extracting archive)
echo.
rem ******************************************************
rem СОЗДАЕМ СПИСОК ФАЙЛОВ И ФАЙЛ ОТВЕТОВ ДЛЯ MAKECAB
rem ******************************************************
@echo .Set CabinetNameTemplate=%name%.cab>make.ddf
@echo .Set CompressionType=MSZIP>>make.ddf
@echo .Set MaxDiskSize=CDROM>>make.ddf
@echo .Set ReservePerCabinetSize=6144>>make.ddf
@echo .Set Compress=on>>make.ddf
@echo .Set CompressionMemory=21>>make.ddf
@echo .Set DiskDirectoryTemplate=".">>make.ddf
@echo .Set Cabinet=ON>>make.ddf
@echo .Set MaxCabinetSize=999999999>>make.ddf
@echo .Set CompressionLevel=^7>>make.ddf
rem ******************************************************
rem СОЗДАЕМ ОБЫЧНЫЙ АРХИВ
rem ******************************************************
chcp 1251>nul
FOR /R %%f IN (*.*) DO (
If not "%%~nxf"=="make.ddf" (
@If not "%%~nxf"=="CabMaker.bat" (@echo "%%f">>make.ddf))
)
makecab /F make.ddf
if /i "%sfx%"=="Y" (goto create_sfx) else ( goto clear)
:clear
del setup.inf
del setup.rpt
del make.ddf
chcp 866 > nul
echo.
echo Creating a backup is successfully completed!
goto action
rem ******************************************************
rem МАГИЕЙ ПРЕВРАЩАЕМ ОБЫЧНЫЙ АРХИВ В САМРАСПАКОВЫВАЮЩИЙСЯ :-)
rem ******************************************************
:create_sfx
copy /b %windir%\system32\extrac32.exe+%name%.cab %name%.exe
del setup.inf
del setup.rpt
del make.ddf
del %name%.cab
chcp 866 > nul
echo.
echo Create self-extracting archive completed successfully!
goto action
VB.NET / VBA:
Option Explicit
' Alex Averchenkoff принадлежит оригинальный код BAT программы MakeCab.
' Dragokas перевел программу на язык Visual Basic 6.
' Dark_Timur исправил и дополнил программу.
' И затем Dragokas еще раз подправил :)
' Версия: 1.1.1
Function CreateCab(Source As String, SourceType As String, ArchName As String, Destination As String, Compress As Boolean, _
CompressLvl As Byte, SubFolders As Boolean, Ext As String, SFX As Boolean, Silent As Boolean) As Long
Dim AddData As String, DDF As String
If LCase(SourceType) = "d" Or LCase(SourceType) = "dir" Or LCase(SourceType) = "directory" Then
AddData = GetData(Source, True, LCase(Ext), Silent)
ElseIf LCase(SourceType) = "f" Or LCase(SourceType) = "file" Then
AddData = """" & Source & """" & vbCrLf
Else
If Not Silent Then MsgBox "Неправильно задан тип исходных данных", vbCritical
CreateCab = 272
Exit Function
End If
If (Err <> 0) Then Exit Function
DDF = GetTempFile() 'DDF будет во временной папке Windows
CreateDDF DDF, ArchName, AddData, Destination, IIf(Compress, "ON", "OFF"), CompressLvl
With CreateObject("WScript.Shell")
CreateCab = .Run("makecab.exe /F """ & DDF & """", 0, True)
If (CreateCab <> 0) Then
If Not Silent Then MsgBox "Ошибка создания архива (" & CreateCab & ")", vbCritical
Dim ExecObj As Object
If Not Silent Then
Set ExecObj = CreateObject("WScript.Shell").Exec("cmd /c makecab.exe /F """ & DDF & """")
MsgBox "Ошибка создания архива (" & CreateCab & ")" & vbCrLf & ExecObj.StdOut.ReadAll(), vbCritical
Set ExecObj = Nothing
End If
Exit Function
End If
If SFX Then 'Превращаем обычный архив в SFX
.Run "cmd /x /c ""copy /b """ & Environ("windir") & "\system32\extrac32.exe""+""" & _
Destination & "\" & ArchName & ".cab"" """ & Destination & "\" & ArchName & ".exe""""", 0, True
Kill Destination & "\" & ArchName & ".cab"
End If
End With
Call Clear(DDF)
If Not Silent Then MsgBox "Готово.", vbInformation
End Function
Function GetData(fold As String, SubFolders As Boolean, Ext As String, Silent As Boolean) As String
On Error Resume Next 'Пропуск папок/файлов, защищенных правами
Dim myfiles As Object, mydirs As Object
Dim fil As Object, dir As Object
With CreateObject("Scripting.FileSystemObject").GetFolder(fold)
Set myfiles = .Files
Set mydirs = .SubFolders
End With
For Each fil In myfiles
If Trim(Ext) = "*" Or Trim(Ext) = "*.*" Or Trim(Ext) = "" Or (LCase(Right(fil.Name, Len(Ext)))) = Ext Then
GetData = GetData & """" & fil.Path & """" & vbCrLf
End If
Next
If SubFolders Then
For Each dir In mydirs
GetData = GetData & ".Set DestinationDir=" & Chr(34) & dir.Name & Chr(34) & vbCrLf & _
GetData(dir.Path, True, Ext, Silent) & vbCrLf
Next
End If
GetData = Left(GetData, Len(GetData) - 2) 'CrLf
Set myfiles = Nothing: Set mydirs = Nothing
End Function
Function GetTempFile() 'Получить временный незанятый файл
Dim FSO As Object, FN As String
Set FSO = CreateObject("Scripting.FileSystemObject")
FN = FSO.GetTempName()
FN = Environ("temp") & "\" & FN
If dir(FN) <> vbNullString Then FN = GetTempFile()
GetTempFile = FN
Set FSO = Nothing
End Function
Function CreateDDF(DDF$, ArchName, GetData$, Out, SetCom As String, SetComLvl As Byte)
Dim ff As Integer
ff = FreeFile()
'Подготовим DDF-файл ответов для архиватора CAB
Open DDF For Output As #ff
Print #ff, ".Set CabinetNameTemplate=" & ArchName & ".cab"
Print #ff, ".Set CompressionType=MSZIP"
Print #ff, ".Set MaxDiskSize=CDROM"
Print #ff, ".Set ReservePerCabinetSize=6144"
Print #ff, ".Set Compress=" & SetCom
Print #ff, ".Set CompressionMemory=21"
Print #ff, ".Set DiskDirectoryTemplate=""."""
Print #ff, ".Set Cabinet=ON"
Print #ff, ".Set UniqueFiles=ON"
If LCase(SetCom) = "on" Then Print #ff, ".Set CompressionLevel=" & CStr(SetComLvl)
Print #ff, ".Set DiskDirectory1=" & Out
Print #ff, GetData
Close #ff
End Function
Sub Clear(DDF$)
On Error Resume Next
Kill Environ("temp") & "\setup.inf"
Kill Environ("temp") & "\setup.rpt"
Kill DDF
End Sub
Source - путь до исходного файла/папки.
SourceType - тип исходных данных. Значения: "d", "dir", "directory" означают, что исходными данными является папка, а Значения: "f", "file" означают, что исходными данными является файл. Регистр значения SourceType не важен. Остальные значения завершают функцию с ошибкой 272.
ArchName - имя будущего архива без расширения. Расширение выбирается компьютером, так что смысла его вводить в ArchName нет.
Destination - путь до папки, где будет создан архив.
Compress - флаг, устанавливающий, использовать сжатие (True) или не использовать (False).
CompressLvl - если используется сжатие, то устанавливает уровень сжатия. Диопазон: 1...7 включительно. При отключенном сжатии важности не представляет.
SubFolders - если архивируется папка и там есть подпапки, то этот флаг устанавливает, архивировать подпапки (True) или не архивировать (False). При архивировании файла важности не представляет.
Ext - если архивируется папка, то устанавливает разрешенное расширение файлов для архивирования. Файлы с неправильным расширением архивированы не будут. Если вы хотите, чтоб архивировались все файлы, то оставьте переменную пустой ("") или введите звездочку ("*" или "*.*"). Также действует и на подпапки, если они архивируются. При архивировании файла важности не представляет.
SFX - устанавливает тип архива. Обычный архив с расширением CAB будет создан, если SFX = False. Иначе, если SFX = True, будет создан SFX (самораспаковывающийся) архив с расширением EXE.
Silent - включает или отключает тихий режим. Если Silent = False, то на экран будут выводиться сообщения. Иначе, если Silent = True, на экран ничего выводиться не будет.
SourceType - тип исходных данных. Значения: "d", "dir", "directory" означают, что исходными данными является папка, а Значения: "f", "file" означают, что исходными данными является файл. Регистр значения SourceType не важен. Остальные значения завершают функцию с ошибкой 272.
ArchName - имя будущего архива без расширения. Расширение выбирается компьютером, так что смысла его вводить в ArchName нет.
Destination - путь до папки, где будет создан архив.
Compress - флаг, устанавливающий, использовать сжатие (True) или не использовать (False).
CompressLvl - если используется сжатие, то устанавливает уровень сжатия. Диопазон: 1...7 включительно. При отключенном сжатии важности не представляет.
SubFolders - если архивируется папка и там есть подпапки, то этот флаг устанавливает, архивировать подпапки (True) или не архивировать (False). При архивировании файла важности не представляет.
Ext - если архивируется папка, то устанавливает разрешенное расширение файлов для архивирования. Файлы с неправильным расширением архивированы не будут. Если вы хотите, чтоб архивировались все файлы, то оставьте переменную пустой ("") или введите звездочку ("*" или "*.*"). Также действует и на подпапки, если они архивируются. При архивировании файла важности не представляет.
SFX - устанавливает тип архива. Обычный архив с расширением CAB будет создан, если SFX = False. Иначе, если SFX = True, будет создан SFX (самораспаковывающийся) архив с расширением EXE.
Silent - включает или отключает тихий режим. Если Silent = False, то на экран будут выводиться сообщения. Иначе, если Silent = True, на экран ничего выводиться не будет.
Вложения
Последнее редактирование: