Skip to content

Commit 7177767

Browse files
committed
fix(installer): improve setup.bat network logic and error handling
1 parent c089a68 commit 7177767

1 file changed

Lines changed: 145 additions & 53 deletions

File tree

src/setup.bat

Lines changed: 145 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,195 @@
1-
@echo off
1+
@echo off
22
setlocal enabledelayedexpansion
33

4+
:: ============================================================================
5+
:: Установщик Java Version Manager (v1.5 - Усиленная сетевая логика)
6+
:: ============================================================================
7+
8+
:: --- Шаг 1: Настройка и очистка лога ---
49
chcp 65001 > nul
510
set "LOG_FILE=%~dp0setup_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=%~dp0src\"
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
1782
exit /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" )
2696
if "!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=%~dp0src\" )
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

Comments
 (0)