Files
go_bt/启动程序.bat

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