@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