@echo off rem ================================================================================ for %%a in ("%~dp0\.") do set "SnPatchVersion=%%~nxa" rem ================================================================================ rem ВНИМАНИЕ!!! Текст сообщений для вывода в файл сделан в кодировке CP1251! rem ================================================================================ rem Сохраняем текущую кодовую страницу for /f "tokens=2 delims=:" %%i in ('chcp') do (set codepage_old=%%i) set codepage_old=%codepage_old:~1,9% rem ================================================================================ rem Проверка на наличие прав администратора if '%1'=='ELEV' (shift /1 & goto Install) >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if %errorlevel% neq 0 ( goto Elevate ) :Install rem ================================================================================ rem При наличии параметра это должен быть каталог для логов устаноки патча set log_dir=%~1 if ^"%log_dir%^" neq "" ( set fin=%log_dir:~-1% if "%fin%" neq "\" (set log_dir=%log_dir%\) ) rem ================================================================================ rem Получение путей rem Путь для консоли управления reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v ControlCenterDir > nul 2> nul if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яюыєўшЄ№ яєЄ№ єёЄрэютъш яЁюфєъЄр" ) else ( call :CheckStatus "[ОШИБКА] Не удалось получить путь установки продукта" ) FOR /F "usebackq tokens=2,* skip=2" %%L IN ( `reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v ControlCenterDir` ) DO SET consolepath=%%M if %consolepath:~-1% EQU \ set consolepath=%consolepath:~0,-1% rem Пути системных файлов set Sys32=%systemroot%\System32 set SysWOW=%systemroot%\SysWOW64 rem Путь драйверов rem set SysDrv=%systemroot%\System32\drivers rem ================================================================================ rem Основная работа по установке патча rem Операция в зависимости от разрядности if "%PROCESSOR_ARCHITECTURE%"=="x86" ( call :PatchX86 ) else ( call :PatchX64 ) rem ================================================================================ if "%log_dir%" neq "" ( chcp 1251 >nul 2>&1 echo ╧рЄў єёЄрэютыхэ єёях°эю > "%log_dir%success.%computername%.%userdomain%.patch_%SnPatchVersion%.log" chcp %codepage_old% >nul 2>&1 ) else ( color 0A echo Патч установлен успешно pause ) exit /b rem ================================================================================ :PatchX86 rem Замена файла с сохранением старой версии Setlocal EnableDelayedExpansion call :GetVersion "%consolepath%\lc.dll" Setlocal DisableDelayedExpansion ren "%consolepath%\lc.dll" "lc.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы lc.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл lc.dll" ) copy "%~dp0Module\win32\lc.dll" "%consolepath%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы lc.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл lc.dll" ) ren "%consolepath%\en-US\lc.dll.mui" "lc.dll.mui%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы en-US\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл en-US\lc.dll.mui" ) copy "%~dp0Module\win32\en-US\lc.dll.mui" "%consolepath%\en-US" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы en-US\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл en-US\lc.dll.mui" ) ren "%consolepath%\ru-RU\lc.dll.mui" "lc.dll.mui%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы ru-RU\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл ru-RU\lc.dll.mui" ) copy "%~dp0Module\win32\ru-RU\lc.dll.mui" "%consolepath%\ru-RU" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы ru-RU\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл ru-RU\lc.dll.mui" ) rem Замена файла с сохранением старой версии Setlocal EnableDelayedExpansion call :GetVersion "%consolepath%\Medusa.exe" Setlocal DisableDelayedExpansion ren "%consolepath%\Medusa.exe" "Medusa.exe%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы Medusa.exe" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл Medusa.exe" ) copy "%~dp0Module\win32\Medusa.exe" "%consolepath%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы Medusa.exe" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл Medusa.exe" ) ren "%consolepath%\en-US\Medusa.resources.dll" "Medusa.resources.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы en-US\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл en-US\Medusa.resources.dll" ) copy "%~dp0Module\win32\en-US\Medusa.resources.dll" "%consolepath%\en-US" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы en-US\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл en-US\Medusa.resources.dll" ) ren "%consolepath%\ru-RU\Medusa.resources.dll" "Medusa.resources.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы ru-RU\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл ru-RU\Medusa.resources.dll" ) copy "%~dp0Module\win32\ru-RU\Medusa.resources.dll" "%consolepath%\ru-RU" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы ru-RU\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл ru-RU\Medusa.resources.dll" ) exit /b rem ================================================================================ :PatchX64 rem Замена файла с сохранением старой версии Setlocal EnableDelayedExpansion call :GetVersion "%consolepath%\lc.dll" Setlocal DisableDelayedExpansion ren "%consolepath%\lc.dll" "lc.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы lc.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл lc.dll" ) copy "%~dp0Module\x64\lc.dll" "%consolepath%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы lc.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл lc.dll" ) ren "%consolepath%\en-US\lc.dll.mui" "lc.dll.mui%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы en-US\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл en-US\lc.dll.mui" ) copy "%~dp0Module\x64\en-US\lc.dll.mui" "%consolepath%\en-US" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы en-US\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл en-US\lc.dll.mui" ) ren "%consolepath%\ru-RU\lc.dll.mui" "lc.dll.mui%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы ru-RU\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл ru-RU\lc.dll.mui" ) copy "%~dp0Module\x64\ru-RU\lc.dll.mui" "%consolepath%\ru-RU" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы ru-RU\lc.dll.mui" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл ru-RU\lc.dll.mui" ) rem Замена файла с сохранением старой версии Setlocal EnableDelayedExpansion call :GetVersion "%consolepath%\Medusa.exe" Setlocal DisableDelayedExpansion ren "%consolepath%\Medusa.exe" "Medusa.exe%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы Medusa.exe" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл Medusa.exe" ) copy "%~dp0Module\x64\Medusa.exe" "%consolepath%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы Medusa.exe" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл Medusa.exe" ) ren "%consolepath%\en-US\Medusa.resources.dll" "Medusa.resources.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы en-US\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл en-US\Medusa.resources.dll" ) copy "%~dp0Module\x64\en-US\Medusa.resources.dll" "%consolepath%\en-US" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы en-US\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл en-US\Medusa.resources.dll" ) ren "%consolepath%\ru-RU\Medusa.resources.dll" "Medusa.resources.dll%file_old_version%" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ яхЁхшьхэютрЄ№ чрьхэ хь√щ Їрщы ru-RU\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось переименовать заменяемый файл ru-RU\Medusa.resources.dll" ) copy "%~dp0Module\x64\ru-RU\Medusa.resources.dll" "%consolepath%\ru-RU" if "%log_dir%" neq "" ( call :CheckStatus "[╬╪╚┴╩└] ═х єфрыюё№ ёъюяшЁютрЄ№ юсэюты╕ээ√щ Їрщы ru-RU\Medusa.resources.dll" ) else ( call :CheckStatus "[ОШИБКА] Не удалось скопировать обновлённый файл ru-RU\Medusa.resources.dll" ) exit /b rem ================================================================================ :GetVersion set file_old_version=_ set file_path=%1 set file_double_path=!file_path:\\=\! set file_double_path=!file_double_path:\=\\! set file_full_ver= wmic datafile where name^=!file_double_path! get Version /value >nul 2>&1 for /F "delims=" %%a in ('wmic datafile where name^=!file_double_path! get Version /value') do ( set file_full_ver=!file_full_ver!%%a ) set file_ver= for /F "tokens=3 delims=.," %%a in ("!file_full_ver!") do set file_ver=!file_ver!_%%a for /F "tokens=4 delims=.," %%a in ("!file_full_ver!") do set file_ver=!file_ver!_%%a set file_old_version=!file_ver! exit /b rem ================================================================================ :CheckStatus if %errorlevel% neq 0 ( if "%log_dir%" neq "" ( chcp 1251 >nul 2>&1 echo %~1 > "%log_dir%fail.%computername%.%userdomain%.patch_%SnPatchVersion%.log" chcp %codepage_old% >nul 2>&1 ) else ( color 0C echo. echo %~1 echo. pause ) exit ) exit /b rem ================================================================================ rem Запуск скрипта с повышением (UAC) :Elevate set "vbsGetPrivileges=%temp%\SNgetPriv_%~n0.vbs" echo. echo ************************************** echo Running as administrator echo ************************************** echo Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%" echo args = "ELEV " >> "%vbsGetPrivileges%" echo For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%" echo args = args ^& strArg ^& " " >> "%vbsGetPrivileges%" echo Next >> "%vbsGetPrivileges%" echo args = "/c """ + "%~f0" + """ " + args >> "%vbsGetPrivileges%" echo UAC.ShellExecute "%SystemRoot%\system32\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%" rem echo UAC.ShellExecute "%~f0", args, "", "runas", 1 >> "%vbsGetPrivileges%" "%SystemRoot%\system32\WScript.exe" "%vbsGetPrivileges%" %* exit /b