1- @ echo off
1+ @ echo off
22setlocal enabledelayedexpansion
33
4+ :: ============================================================================
5+ :: Установщик Java Version Manager (v1.5 - Усиленная сетевая логика)
6+ :: ============================================================================
7+
8+ :: --- Шаг 1: Настройка и очистка лога ---
49chcp 65001 > nul
510set " LOG_FILE = %~dp0 setup_log.txt"
6-
7- powershell -Command " $bom = [System.Text.Encoding]::UTF8.GetPreamble(); [System.IO.File]::WriteAllBytes('!LOG_FILE! ', $bom)"
811(
912 echo Starting log at %TIME% on %DATE%
1013 echo . & echo === SCRIPT STARTED ===
1114 echo Script path: %~dp0
12- echo Current directory: %cd%
13- echo . & echo --- Initial Environment Variables --- & set & echo .
14- ) >> " !LOG_FILE! "
15+ echo Current directory: %cd% & echo .
16+ ) > " !LOG_FILE! "
17+
18+ :: --- Шаг 2: Локализация ---
19+ call :localize
20+ call :log_and_echo " !TITLE_INSTALLER! "
21+ echo .
22+
23+ :: --- Шаг 3: Проверка прав администратора ---
24+ net session > nul 2 >& 1
25+ if errorlevel 1 (
26+ call :log_and_echo " !PROMPT_ADMIN! "
27+ pause
28+ exit /b
29+ )
30+
31+ :: --- Шаг 4: Проверка наличия файлов и восстановление ---
32+ set " SRC_DIR = %~dp0 src\"
33+ if exist " %SRC_DIR% set-java.ps1" (
34+ goto :install_main
35+ )
36+
37+ call :recover_files
38+ if errorlevel 1 (
39+ pause
40+ exit /b
41+ )
42+
43+ :: --- Шаг 5: Основная логика установки ---
44+ :install_main
45+ set " java_install_path = "
46+ for /f " usebackq delims=" %%i in (`powershell -NoProfile -Command " (Get-Content -Path '!SRC_DIR! config.json' -Raw | ConvertFrom-Json).javaInstallPath" 2^ > nul `) do (
47+ set " java_install_path = %%i "
48+ )
49+ if not defined java_install_path set " java_install_path = %ProgramFiles% \Java"
50+ set " scripts_target_dir = %java_install_path% \scripts"
51+
52+ call :log_and_echo " !INFO_INSTALL_TO! -> !scripts_target_dir! "
53+ if not exist " !scripts_target_dir! " ( mkdir " !scripts_target_dir! " & call :log_and_echo " !INFO_DIR_CREATED! " )
54+
55+ call :log_and_echo " !INFO_COPYING! "
56+ xcopy " !SRC_DIR! *" " !scripts_target_dir! \" /E /I /Y /Q > nul
57+
58+ call :log_and_echo " !INFO_ALIASES! "
59+ (
60+ echo @echo off
61+ echo chcp 65001 ^ > nul
62+ echo powershell -NoProfile -ExecutionPolicy Bypass -File " %scripts_target_dir% \set-java.ps1" %% *
63+ ) > " %scripts_target_dir% \set-java.bat"
64+ copy /y " %scripts_target_dir% \set-java.bat" " %scripts_target_dir% \javas.bat" > nul
65+ copy /y " %scripts_target_dir% \set-java.bat" " %scripts_target_dir% \jav.bat" > nul
66+
67+ call :log_and_echo " !INFO_PATH! "
68+ powershell -NoProfile -Command ^
69+ " $regKey='HKLM:\System\CurrentControlSet\Control\Session Manager\Environment'; $p=(Get-ItemProperty -Path $regKey).Path; $t='%scripts_target_dir% '; if($p -notlike '*'+$t+'*'){Set-ItemProperty -Path $regKey -Name Path -Value ($p+';'+$t); Write-Host 'Path updated.'} else{Write-Host '!INFO_PATH_EXISTS! '}" >> " !LOG_FILE! "
70+
71+ echo . & call :log_and_echo " !INFO_SUCCESS! " & call :log_and_echo " !INFO_RESTART! " & echo .
72+ pause
73+
74+ :: --- Шаг 6: Открытие нового терминала с запущенным set-java ---
75+ where wt.exe > nul 2 >& 1
76+ if %ERRORLEVEL% EQU 0 (
77+ start wt.exe powershell.exe -NoExit -Command " & '%scripts_target_dir% \set-java.bat'"
78+ ) else (
79+ start cmd.exe /k " !scripts_target_dir! \set-java.bat"
80+ )
1581
16- call :main >> " !LOG_FILE! " 2 >& 1
1782exit /b
1883
1984:: ============================================================================
20- :: Основной блок скрипта
85+ :: ПОДПРОГРАММЫ
2186:: ============================================================================
22- :main
23- :: --- 1. Определение языка ---
24- for /f " tokens=*" %%a in ('powershell -NoProfile -Command " (Get-UICulture).Name" ') do set " SYS_LANG = %%a "
2587
88+ :log_and_echo
89+ (echo [%TIME% ] %* ) >> " !LOG_FILE! "
90+ echo %*
91+ goto :eof
92+
93+ :localize
94+ set " SYS_LANG = en"
95+ for /f " tokens=3" %%a in ('reg query " HKCU\Control Panel\International" /v LocaleName 2^ > nul ') do ( set " SYS_LANG = %%a " )
2696if " !SYS_LANG:~0 ,2 ! " == " ru" (
97+ set " TITLE_INSTALLER = --- Установщик Java Version Manager ---"
2798 set " PROMPT_ADMIN = [ОШИБКА] Требуются права администратора."
2899 set " PROMPT_WARN_MISSING = [ВНИМАНИЕ] Не найдены основные файлы скрипта."
29100 set " PROMPT_CONFIRM_DOWNLOAD = Попробовать скачать полный пакет с GitHub? (Y/N): "
30101 set " PROMPT_CANCEL = Установка отменена."
31102 set " INFO_DOWNLOADING = Скачивание последней версии..."
103+ set " INFO_UNPACKING = Распаковка..."
32104 set " INFO_INSTALL_TO = Установка в:"
33105 set " INFO_DIR_CREATED = Целевая директория создана."
34106 set " INFO_COPYING = Копирование файлов..."
35107 set " INFO_ALIASES = Создание алиасов (set-java, javas, jav)..."
36108 set " INFO_PATH = Добавление в системный PATH..."
37109 set " INFO_PATH_EXISTS = Путь уже добавлен в системный PATH. Пропускаем."
38110 set " INFO_SUCCESS = --- Установка успешно завершена! ---"
111+ set " INFO_RESTART = Перезапустите терминал, чтобы применить изменения."
39112 set " INFO_OPENING = Открытие Java Version Manager в новом окне Терминала Windows..."
40113) else (
114+ set " TITLE_INSTALLER = --- Java Version Manager Installer ---"
41115 set " PROMPT_ADMIN = [ERROR] Administrator rights are required."
42116 set " PROMPT_WARN_MISSING = [WARN] Core script files not found."
43117 set " PROMPT_CONFIRM_DOWNLOAD = Attempt to download the full package from GitHub? (Y/N): "
44118 set " PROMPT_CANCEL = Installation cancelled."
45119 set " INFO_DOWNLOADING = Downloading the latest version..."
120+ set " INFO_UNPACKING = Unpacking..."
46121 set " INFO_INSTALL_TO = Installing to:"
47122 set " INFO_DIR_CREATED = Target directory created."
48123 set " INFO_COPYING = Copying files..."
49124 set " INFO_ALIASES = Creating aliases (set-java, javas, jav)..."
50125 set " INFO_PATH = Adding to system PATH..."
51126 set " INFO_PATH_EXISTS = Path is already in system PATH. Skipping."
52127 set " INFO_SUCCESS = --- Installation completed successfully! ---"
128+ set " INFO_RESTART = Please restart your terminal for changes to take effect."
53129 set " INFO_OPENING = Opening Java Version Manager in a new Windows Terminal window..."
54130)
55- echo !TITLE_INSTALLER! & echo .
56-
57- :: --- 2. Проверка прав администратора ---
58- > nul 2 >& 1 " %SYSTEMROOT% \system32\cacls.exe" " %SYSTEMROOT% \system32\config\system"
59- if '%errorlevel% ' NEQ '0' ( echo . & echo !PROMPT_ADMIN! & echo . & pause & exit /b )
60-
61- :: --- 3. Проверка наличия файлов и восстановление ---
62- set " SRC_DIR = %~dp0 "
63- if not exist " %SRC_DIR% set-java.ps1" ( set " SRC_DIR = %~dp0 src\" )
64- if not exist " %SRC_DIR% set-java.ps1" (
65- echo . & echo !PROMPT_WARN_MISSING! & echo .
66- set /p " CHOICE = !PROMPT_CONFIRM_DOWNLOAD! "
67- if /i " !CHOICE! " neq " Y" ( echo !PROMPT_CANCEL! & pause & exit /b )
68- echo !INFO_DOWNLOADING!
69- set " TEMP_DIR = %TEMP% \jman-recovery"
70- if exist " %TEMP_DIR% " rd /s /q " %TEMP_DIR% "
71- md " %TEMP_DIR% "
72- powershell -NoProfile -Command " & { (New-Object Net.WebClient).DownloadFile('https://github.com/PixelmonPRO/Java-Version-Manager/releases/latest/download/java-manager.zip', '%TEMP_DIR% \release.zip') }" > nul 2 >& 1
73- echo !INFO_UNPACKING!
74- powershell -NoProfile -Command " Expand-Archive -Path '%TEMP_DIR% \release.zip' -DestinationPath '%TEMP_DIR% ' -Force" > nul 2 >& 1
75- set " SRC_DIR = %TEMP_DIR% \src\"
76- )
131+ goto :eof
77132
78- :: --- 4. Основная логика установки ---
79- set " config_file = !SRC_DIR! config.json "
80- set " java_install_path = "
81- for /f " usebackq delims= " %%i in (`powershell -NoProfile -Command " (Get-Content -Path ' !config_file! ' -Raw | ConvertFrom-Json).javaInstallPath " `) do set " java_install_path = %%i "
133+ :recover_files
134+ call : log_and_echo " !PROMPT_WARN_MISSING! "
135+ set /p " CHOICE = !PROMPT_CONFIRM_DOWNLOAD! "
136+ if /I " !CHOICE! " NEQ " Y " ( call : log_and_echo " !PROMPT_CANCEL! " & exit /b 1 )
82137
83- if not defined java_install_path ( set " java_install_path = %ProgramFiles% \Java" )
138+ set " TEMP_DIR = %TEMP% \jman-recovery"
139+ set " ZIP_PATH = %TEMP_DIR% \release.zip"
140+ set " EXTRACT_DIR = %TEMP_DIR% \extracted"
84141
85- set " scripts_target_dir = !java_install_path! \scripts"
86- echo !INFO_INSTALL_TO! " !scripts_target_dir! " & echo .
87- if not exist " !scripts_target_dir! " ( mkdir " !scripts_target_dir! " & echo !INFO_DIR_CREATED! )
142+ if exist " %TEMP_DIR% " rd /s /q " %TEMP_DIR% "
143+ md " %TEMP_DIR% " & md " %EXTRACT_DIR% "
88144
89- echo !INFO_COPYING!
90- xcopy " !SRC_DIR! *" " !scripts_target_dir! \" /E /I /Y /Q > nul
145+ call :log_and_echo " !INFO_DOWNLOADING! & !INFO_UNPACKING! " ...
91146
92- echo !INFO_ALIASES!
93- (echo @ echo off & echo chcp 65001 ^ > nul & echo powershell -NoProfile -ExecutionPolicy Bypass -File " !scripts_target_dir! \set-java.ps1" %* ) > " !scripts_target_dir! \set-java.bat"
94- (echo @ echo off & echo chcp 65001 ^ > nul & echo powershell -NoProfile -ExecutionPolicy Bypass -File " !scripts_target_dir! \set-java.ps1" %* ) > " !scripts_target_dir! \javas.bat"
95- (echo @ echo off & echo chcp 65001 ^ > nul & echo powershell -NoProfile -ExecutionPolicy Bypass -File " !scripts_target_dir! \set-java.ps1" %* ) > " !scripts_target_dir! \jav.bat"
147+ :: Проверка наличия curl
148+ where curl > nul 2 >& 1
149+ if %ERRORLEVEL% EQU 0 (
150+ :: Используем curl для скачивания
151+ curl -L --ssl-no-revoke -o " %ZIP_PATH% " " https://github.com/PixelmonPRO/Java-Version-Manager/releases/latest/download/java-manager.zip"
152+ if errorlevel 1 (
153+ call :log_and_echo " [ERROR] curl failed to download file."
154+ exit /b 1
155+ )
156+ ) else (
157+ :: fallback к PowerShell (с TLS 1.2 и User-Agent)
158+ powershell -NoProfile -ExecutionPolicy Bypass -Command ^
159+ " [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls; " ^
160+ " try { " ^
161+ " Invoke-WebRequest -Uri 'https://github.com/PixelmonPRO/Java-Version-Manager/releases/latest/download/java-manager.zip' -OutFile '%ZIP_PATH% ' -UseBasicParsing -Headers @{ 'User-Agent' = 'Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US)' } -ErrorAction Stop; " ^
162+ " Add-Type -AssemblyName System.IO.Compression.FileSystem; " ^
163+ " [System.IO.Compression.ZipFile]::ExtractToDirectory('%ZIP_PATH% ', '%EXTRACT_DIR% '); " ^
164+ " } catch { " ^
165+ " $logPath = '%LOG_FILE% '; " ^
166+ " '--- POWERSHELL ERROR ---' | Out-File -FilePath $logPath -Append -Encoding utf8; " ^
167+ " $_.Exception.ToString() | Out-File -FilePath $logPath -Append -Encoding utf8; " ^
168+ " if ($_.Exception.InnerException) { " ^
169+ " '--- INNER EXCEPTION ---' | Out-File -FilePath $logPath -Append -Encoding utf8; " ^
170+ " $_.Exception.InnerException.ToString() | Out-File -FilePath $logPath -Append -Encoding utf8; " ^
171+ " } " ^
172+ " exit 1; " ^
173+ " }"
174+ )
96175
97- echo !INFO_PATH!
98- powershell -NoProfile -Command " $regPath = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment'; $currentPath = (Get-ItemProperty -Path $regPath -Name Path).Path; $newDir = '!scripts_target_dir! '; if(-not ($currentPath.ToLower() -split ';' -contains $newDir.ToLower())) { $newPath = $currentPath + ';' + $newDir; Set-ItemProperty -Path $regPath -Name Path -Value $newPath; echo 'Path updated.' } else { echo '!INFO_PATH_EXISTS! ' }"
176+ if errorlevel 1 ( call :log_and_echo " !PROMPT_DOWNLOAD_FAIL! " & exit /b 1 )
177+
178+ :: Распаковка zip файла
179+ powershell -NoProfile -ExecutionPolicy Bypass -Command ^
180+ " Add-Type -AssemblyName System.IO.Compression.FileSystem; " ^
181+ " try { [System.IO.Compression.ZipFile]::ExtractToDirectory('%ZIP_PATH% ', '%EXTRACT_DIR% '); } catch { exit 1 }"
182+ if errorlevel 1 (
183+ call :log_and_echo " [ERROR] Failed to extract downloaded archive."
184+ exit /b 1
185+ )
99186
100- :: --- 5. Завершение и запуск ---
101- echo . & echo !INFO_SUCCESS! & echo . & echo !INFO_OPENING!
102- start wt.exe powershell.exe -NoExit -Command " & '!scripts_target_dir! \set-java.bat'"
103- goto :eof
187+ if not exist " %EXTRACT_DIR% \src\config.json" (
188+ call :log_and_echo " !PROMPT_STRUCTURE_FAIL! "
189+ exit /b 1
190+ )
191+
192+ set " SRC_DIR = %EXTRACT_DIR% \src\"
193+ call :log_and_echo " !INFO_DOWNLOAD_SUCCESS! "
194+
195+ exit /b
0 commit comments