99 lines
3.7 KiB
Batchfile
99 lines
3.7 KiB
Batchfile
@echo off
|
|
chcp 65001 >nul
|
|
cd /d "%~dp0"
|
|
|
|
echo ╔═══════════════════════════════════════╗
|
|
echo ║ Gemini Go Web - Node.js版 ║
|
|
echo ╚═══════════════════════════════════════╝
|
|
|
|
:: ── 0. 检查 Node.js ───────────────────────────────────────
|
|
node -v >nul 2>&1
|
|
if errorlevel 1 (
|
|
echo [!] 未检测到 Node.js,请先运行 "安装依赖.bat" 或手动安装 Node.js 20+
|
|
pause
|
|
exit /b 1
|
|
)
|
|
|
|
:: ── 1. 从 src\core\config.js 读取端口(与服务器保持一致,避免脚本和代码不同步)
|
|
set PORT=3000
|
|
for /f "tokens=2 delims=:, " %%p in ('findstr /b /r /c:" *PORT:" src\core\config.js') do set PORT=%%p
|
|
echo [*] 服务端口: %PORT% (由 src\core\config.js 决定)
|
|
|
|
:: ── 2. 结束占用该端口的旧 node 进程(只结束 node.exe,避免误杀其他程序)
|
|
set OCCUPIED=
|
|
set KILLED=
|
|
for /f "tokens=5" %%a in ('netstat -ano ^| findstr /r /c:":%PORT% .*LISTENING"') do call :handle_old_pid %%a
|
|
if defined OCCUPIED (
|
|
pause
|
|
exit /b 1
|
|
)
|
|
if defined KILLED timeout /t 1 /nobreak >nul
|
|
|
|
:: ── 3. 首次运行安装依赖 ───────────────────────────────────
|
|
if not exist "node_modules" (
|
|
echo [*] 首次运行,正在安装依赖...
|
|
call npm install
|
|
if errorlevel 1 (
|
|
echo [!] 依赖安装失败,请检查网络或运行 "安装依赖.bat"
|
|
pause
|
|
exit /b 1
|
|
)
|
|
echo [✓] 依赖安装完成
|
|
)
|
|
|
|
:: ── 4. 启动服务器(cmd /k:若 node 报错退出,窗口会保留以便查看错误信息)
|
|
echo [*] 启动服务器...
|
|
start "Gemini Go Server" /min cmd /k node --max-old-space-size=2048 server.js
|
|
|
|
:: ── 5. 等待端口就绪(最多 30 秒),就绪后再打开浏览器
|
|
echo [*] 等待服务器就绪...
|
|
set /a TRIES=0
|
|
:wait_loop
|
|
netstat -ano | findstr /r /c:":%PORT% .*LISTENING" >nul 2>&1
|
|
if not errorlevel 1 goto :ready
|
|
set /a TRIES+=1
|
|
if %TRIES% geq 30 goto :failed
|
|
timeout /t 1 /nobreak >nul
|
|
goto :wait_loop
|
|
|
|
:ready
|
|
echo [*] 打开浏览器...
|
|
start http://localhost:%PORT%
|
|
echo.
|
|
echo [✓] 启动完成!浏览器已打开 http://localhost:%PORT%
|
|
echo 关闭此窗口不会停止服务器
|
|
echo 如需停止服务器,请关闭 "Gemini Go Server" 窗口
|
|
echo.
|
|
echo 提示:浏览器自动化功能需要先运行「比特浏览器」(本地接口 127.0.0.1:54345)
|
|
timeout /t 5 >nul
|
|
exit /b 0
|
|
|
|
:failed
|
|
echo.
|
|
echo [!] 30 秒内服务器未在 %PORT% 端口启动。
|
|
echo 请切换到 "Gemini Go Server" 窗口(任务栏中已最小化)查看报错信息。
|
|
echo 常见原因:依赖未安装完整(运行 "安装依赖.bat")、数据库文件被占用、端口冲突。
|
|
pause
|
|
exit /b 1
|
|
|
|
:: ── 子过程:处理占用端口的单个 PID ────────────────────────
|
|
:handle_old_pid
|
|
set "OLDPID=%~1"
|
|
if "%OLDPID%"=="" goto :eof
|
|
if "%OLDPID%"=="0" goto :eof
|
|
:: 是 node.exe → 结束
|
|
tasklist /fi "PID eq %OLDPID%" /fi "IMAGENAME eq node.exe" /nh 2>nul | findstr /i /c:"node.exe" >nul
|
|
if not errorlevel 1 (
|
|
echo [*] 发现旧的服务器进程 PID=%OLDPID% 占用 %PORT% 端口,正在结束...
|
|
taskkill /f /pid %OLDPID% >nul 2>&1
|
|
set KILLED=1
|
|
goto :eof
|
|
)
|
|
:: 不是 node.exe:若进程仍存在,说明端口被其他程序占用;若已不存在(IPv4/IPv6 重复行),忽略
|
|
tasklist /fi "PID eq %OLDPID%" /nh 2>nul | findstr /c:" %OLDPID% " >nul
|
|
if not errorlevel 1 (
|
|
echo [!] 端口 %PORT% 被其他程序占用 PID=%OLDPID%,请结束该程序或修改 src\core\config.js 中的 PORT
|
|
set OCCUPIED=1
|
|
)
|
|
goto :eof
|