Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: =======================================================
:: Файлы можно скачать здесь:
:: http://download.virtualbox.org/virtualbox/vboxdownload.html#windows
:: =======================================================
:: Размер словаря (МБ), измените, если у Вас недостаточно оперативной памяти
:: Set dictUser=32
:: Установить 1 для удаления языков и документации
Set lite=1
:: Установить 1 для принудительной упаковки консольным архиватором (при проблемах с упаковкой)
Set consol=1
:: =======================================================
Title Создание аддона Virtual Box
If "%Time:~0,1%"==" " (Set tt=0%Time:~1,1%-%Time:~3,2%) Else Set tt=%Time:~0,2%-%Time:~3,2%
Echo Запущено %Date% в %tt%
Echo Подготовка ...
Call :Sec strt1
Call :_DelTemp
Del /Q Virtu*.* 1>Nul 2>&1
MD Temp 1>Nul 2>&1
Set xOS=x86& If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64
If "%xOS%"=="x86" Set ProgramW6432=%ProgramFiles%& Set ProgramFiles(x86)=%ProgramFiles%
:: =======================================================
:: Путь к установленному архиватору 7-Zip без слеша в конце. Если у Вас путь нестандартный, то впишите АБСОЛЮТНЫЙ путь.
Set path7Zip=%ProgramW6432%\7-Zip
rem Echo %path7Zip%
:: =======================================================
Call :_TestSys
For %%i In ("download\*.exe") Do Set nameExe=%%~nxi
If Not Defined nameExe Call :_Abort "Отсутствует дистрибутив VirtualBox (.exe файл)."
For /F "tokens=2,3 delims=-" %%i In ("%nameExe%") Do (
Set verexe=%%i
Set Build=%%j
Set nVer=%%i-r%%j
)
Set VerC=%verexe:.=,%,0
Copy bin\7zsd_LZMA2.sfx Temp\7zsd_LZMA2.sfx>Nul
For /F "tokens=* delims=" %%i In (bin\ver.rc) Do (
Set ti=%%i
Set ti=!ti:02.12.2010=%Date%!
Set ti=!ti:1,18,6,1444=%VerC%!
Set ti=!ti:3.2.12=%verexe%!
Set ti=!ti:68302=%Build%!
Echo !ti! >>Temp\ver.rc
)
bin\Rc.exe /r /fo Temp\ver.res Temp\ver.rc>Nul
bin\ResHacker.exe -addoverwrite Temp\7zsd_LZMA2.sfx, Temp\7zsd_LZMA2.sfx, Temp\ver.res,,,
bin\ResHacker.exe -addoverwrite Temp\7zsd_LZMA2.sfx, Temp\7zsd_LZMA2.sfx, bin\101.ico, Icon, 101,
Del bin\ResHacker.ini bin\ResHacker.log >nul
Set FullName=VirtualBox_%verexe%_x86_x64
MD Temp\%FullName%\Files\ForceCopy\SVCPACK 1>Nul 2>&1
Echo Распаковка %nameExe% ...
Set pmsi=%cd%\Temp
PushD Temp
..\download\%nameExe% -x -s -p "%pmsi%"
For %%i In (*.msi) Do (
Set tn=%%~ni
Set x!tn:~-2!=%%~ni
)
Echo Создание админ. точки из %x86% ...
msiexec /a "%pmsi%\%x86%.msi" /qn TARGETDIR="%pmsi%\%x86%"
If Not %ErrorLevel%==0 PopD & Call :_Abort "Ошибка %ErrorLevel% создания админ. точки (x86). Повторите."
Echo Создание админ. точки из %x64% ...
msiexec /a "%pmsi%\%x64%.msi" /qn TARGETDIR="%pmsi%\%x64%"
If Not %ErrorLevel%==0 PopD & Call :_Abort "Ошибка %ErrorLevel% создания админ. точки (x64). Повторите."
If %lite%==1 (
Echo Удаление мусора из админ. точек ...
For %%i In ("%x86%\PFiles\Oracle VM VirtualBox\nls\*.qm") Do (
Set ti=%%~ni
If /I Not !ti:~-2!==ru If /I Not !ti:~-2!==en CD. >%%i
)
CD. >"%x86%\PFiles\Oracle VM VirtualBox\doc\UserManual.pdf"
CD. >"%x86%\PFiles\Oracle VM VirtualBox\VirtualBox.chm"
For %%i In ("%x64%\PFiles\Oracle VM VirtualBox\nls\*.qm") Do (
Set ti=%%~ni
If /I Not !ti:~-2!==ru If /I Not !ti:~-2!==en CD. >%%i
)
CD. >"%x64%\PFiles\Oracle VM VirtualBox\doc\UserManual.pdf"
CD. >"%x64%\PFiles\Oracle VM VirtualBox\VirtualBox.chm"
)
Call :_sizedir "%x86%"
Set /A All += dirsize
Call :_sizedir "%x64%"
Set /A All += dirsize, AllMB = All/1024/1024
Echo Дост. словарь - !AllMB! МБ (исходя из размера данных !All!)
Echo Упаковка админ. точек в архив ...
Call :compr "Упаковка админ. точек в архив" "2in1.7z %x86% %x64%"
Echo Упаковка архива админ. точек и автономного архиватора в архив ...
Set tcomline=%comline%
Set comline=-mx0
Call :compr "Упаковка архива админ. точек и автономного архиватора" "VirtuBox.7z 2in1.7z ..\bin\7zr.exe ..\bin\PrivateHash.exe"
Set comline=%tcomline%
Echo Создание SFX
Copy ..\bin\VirtualBox_config.txt >Nul
(Echo SetEnvironment="Vers= v%verexe%"
Echo SetEnvironment="nVer=%nVer%"
Echo ;^^!@InstallEnd@^^!)>>VirtualBox_config.txt
Copy /b ..\Temp\7zsd_LZMA2.sfx + VirtualBox_config.txt + VirtuBox.7z ..\VirtuBox.exe>Nul
Copy ..\VirtuBox.exe %FullName%\Files\ForceCopy\SVCPACK\ >Nul
Echo VirtuBox.exe -ai -gm2 -fm0>%FullName%\Run
(Echo └ффюэ VirtualBox v%verexe% [x86/x64]
Echo.
Echo ╤юфхЁцшЄ фтх тхЁёшш ^(x86 ш x64^). ╧Ёш єёЄрэютъх ЁрчЁ*фэюёЄ№ ёшёЄхь√ юяЁхфхы*хЄё*
Echo ртЄюьрЄшўхёъш ш єёЄрэртыштрхЄё* ёююЄтхЄёЄтє■∙р* тхЁёш* тшЁЄєры№эющ ьр°шэ√.
Echo.
Echo VirtualBox - тшЁЄєры№эр* ьр°шэр.
Echo.
Echo ╤рщЄ яЁюуЁрьь√: http://www.virtualbox.org/
Echo ┬хЄър рффюэр: http://forum.oszone.net/post-1436397.html#post1436397
Echo.
Echo ╠хёЄю єёЄрэютъш: %%PROGRAMFILES%%\Oracle\VirtualBox\
Echo ╤яюёюс єёЄрэютъш: SVCPACK, ьюцхЄ шёяюы№чютрЄ№ё* ш фы* єёЄрэютъш эр "цштє■" ёшёЄхьє.
Echo ▀Ёы√ъш ёючфр■Єё*: т ьхэ■ ╧єёъ-^>╧ЁюуЁрьь√, эр Ёрсюўхь ёЄюых, эр ярэхыш с√ёЄЁюую чряєёър.
Echo ╧ЁхфєёьюЄЁхэр тючьюцэюёЄ№ єфрыхэш* яЁюуЁрьь√ ўхЁхч ряяыхЄ "╙ёЄрэютър ш єфрыхэшх яЁюуЁрьь".
Echo.
Echo └ффюэ яЁхфэрчэрўхэ фы* шёяюы№чютрэш* ё яръхЄюь юсэютыхэшщ UpdatePack-XPSP3-Rus
Echo.
Echo ^(c^) gora, %Date%)>%FullName%\addon.nfo
Echo Упаковка аддона в архив ...
Call :compr "Упаковка аддона в архив" "..\%FullName%.7z %FullName%"
PopD
Call :_control "%FullName%.7z" "2in1.7z"
Call :Sec strt2
Set /a tmake=strt2-strt1
Echo.
Echo Аддон создан и упакован за %tmake%с ^^!
Echo Размер %size% МБ (со словарем %rdict1% МБ)
Echo.
Echo Для удаления временных файлов и выхода нажмите любую клавишу.
Echo.
Pause >Nul
Call :_DelTemp
Exit
:compr
If "%consol%"=="1" (
Start /min /wait "%~1" "%path7Zip%\7z.exe" a -r %~2 %comline%
) Else (
Start /min /wait "" "%path7Zip%\7zG.exe" a -r %~2 %comline%
)
Set ErL=%ErrorLevel%
If %ErL%==0 GoTo :EOF
If %ErL%==2 Set Err=Фатальная ошибка.
If %ErL%==8 Set Err=Недостаточно памяти для операции.
If %ErL%==255 Set Err=Пользователь остановил процесс.
PopD
Call :_Abort "Ошибка упаковки %ErL%. %Err%"
GoTo :EOF
:_control
Set /A size=%~z1*10/1024*10/1024
Set size=%size:~0,-2%.%size:~-2%
For /F "tokens=1-5 usebackq delims==: " %%i In (`"%path7Zip%\7z.exe" l -slt Temp\%~2`) Do If "%%i"=="Method" If Not "%%l"=="" Set rdict=%%l
If "%rdict:~-1%"=="m" (
Set rdict1=%rdict:~,-1%
GoTo :EOF
)
Set /A rdict-=21
Set rdict1=2
For /L %%i In (1,1,%rdict%) Do Set /A rdict1*=2
GoTo :EOF
:_Abort
COLOR 0C
Echo %~1 Создание аддона прервано^^!
Pause >Nul
Call :_DelTemp
Exit
:_TestSys
If Not Exist "%path7Zip%\7zG.exe" Call :_Abort "Неверный путь к архиватору 7-Zip."
For /F "tokens=1-4 usebackq" %%i In (`"%path7Zip%\7z.exe"`) Do (
If "%%i"=="7-Zip" (
If "%%j"=="[64]" (
Set arch64=%%j
Set Ver=%%k
If "%%l"=="beta" Set Beta=%%l
If "%%l"=="alpha" Set Beta=%%l
) Else (
Set Ver=%%j
If "%%k"=="beta" Set Beta=%%k
If "%%k"=="alpha" Set Beta=%%k
)
)
)
If %Ver% LSS 9.04 Call :_Abort "Старая версия архиватора 7-Zip. Обновите."
For /F "Tokens=1,2 Skip=1" %%i In ('WMIC OS Get FreePhysicalMemory^, TotalVisibleMemorySize') Do (
Set /A Fram=%%i/1024, Aram=%%j/1024
GoTo :_End
)
:_End
Set /a dictM=(%Fram%-4)*10/115
For %%a In (16 24 32 48 64 96 128 192 256 384 512 768 1024) Do If %%a LEQ %dictM% Set dict=%%a
Call :_Limit
Echo.
Echo Разрядность ОС - %xOS%
Echo Версия 7-Zip - %Ver% %Beta% %arch64%
Echo RAM всего - %Aram% МБ
Echo RAM свободно - %Fram% МБ (без учета фрагментации)
Echo Макс. словарь - %dictM% МБ (исходя из свободных %Fram% МБ)
Echo Реком. словарь - %dict% МБ (исходя из макс. словаря %dictM% МБ%limit%)
If Defined dictUser (
If Defined limit2 (
Echo Польз. словарь - %dictUser% МБ ^(будет использован %Sdict% МБ%limit2%^)
) Else (
Echo Польз. словарь - %dictUser% МБ
Set Sdict=%dictUser%
)
) Else (
Echo Польз. словарь - не задан ^(будет использован рекомендованный %dict% МБ^)
Set Sdict=%dict%
)
Echo.
Set comline=-mmt2 -m0=BCJ2 -m1=LZMA2:d%Sdict%m:fb273 -m2=LZMA2:d21:fb273 -m3=LZMA2:d21:fb273 -mb0:1 -mb0s1:2 -mb0s2:3
GoTo :EOF
:_Limit
If %xOS%==x64 GoTo :EOF
If %dict% GTR 128 Set limit= [предел x86]& Set dict=128
If Not Defined dictUser GoTo :EOF
If %dictUser% GTR 128 Set limit2= [предел x86]& Set Sdict=128
GoTo :EOF
:_DelTemp
RD /s /q Temp 1>Nul 2>&1
If Not Exist Temp GoTo :EOF
Ping -n 2 localhost>Nul
GoTo :_DelTemp
:Sec
Set tm=%time%
Set /a %1=3600*%tm:~0,2%+60*1%tm:~3,2%+1%tm:~6,2%
GoTo :EOF
:_sizedir
For /F "tokens=1-3" %%a In ('Dir %1 /-C /S /A:-D') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else Set flag=0
)
GoTo :EOF