@echo off REM 保存原始编码 for /f "tokens=2 delims=:" %%a in ('chcp') do set OLDCP=%%a chcp 65001 >nul 2>&1 REM n8n 中文版快速启动脚本 (Windows版 - 增强兼容性) REM 作者: 小齐 REM 最后更新: 2025-09-08 REM 兼容性: Windows 7/8/10/11, PowerShell/CMD setlocal enabledelayedexpansion REM 显示启动横幅 :show_banner echo ====================================== echo n8n 中文版快速启动脚本 echo 版本: n8n-1.109.2 with 中文翻译 echo 维护者: xiaoqi echo ====================================== echo. REM 解析命令行参数 set "DEV_MODE=" set "FORCE_BUILD=" set "CHECK_ONLY=" set "SKIP_DEPS=" set "USE_NPM=" set "CUSTOM_PORT=5678" :parse_args if "%~1"=="" goto main_execution if /I "%~1"=="-h" goto show_help if /I "%~1"=="--help" goto show_help if /I "%~1"=="-d" ( set "DEV_MODE=true" shift goto parse_args ) if /I "%~1"=="--dev" ( set "DEV_MODE=true" shift goto parse_args ) if /I "%~1"=="-b" ( set "FORCE_BUILD=true" shift goto parse_args ) if /I "%~1"=="--build" ( set "FORCE_BUILD=true" shift goto parse_args ) if /I "%~1"=="-c" ( set "CHECK_ONLY=true" shift goto parse_args ) if /I "%~1"=="--check" ( set "CHECK_ONLY=true" shift goto parse_args ) if /I "%~1"=="--skip-deps" ( set "SKIP_DEPS=true" shift goto parse_args ) if /I "%~1"=="--npm" ( set "USE_NPM=true" shift goto parse_args ) if /I "%~1"=="-p" ( set "CUSTOM_PORT=%~2" shift shift goto parse_args ) if /I "%~1"=="--port" ( set "CUSTOM_PORT=%~2" shift shift goto parse_args ) echo [错误] 未知选项: %~1 goto show_help :main_execution REM 检查操作系统版本 call :check_os_version REM 检查并切换到正确目录 call :check_and_change_directory if errorlevel 1 goto error_exit REM 检查依赖 if not defined SKIP_DEPS ( echo [信息] 正在检查系统依赖... call :check_dependencies if errorlevel 1 goto error_exit ) REM 检查端口占用 call :check_port if errorlevel 1 goto error_exit REM 停止现有进程 call :stop_existing REM 设置环境变量 call :setup_environment REM 仅检查模式 if defined CHECK_ONLY ( echo [成功] 系统状态检查完成,一切正常 goto end ) REM 安装依赖(如果需要) if not exist "node_modules\" ( echo [信息] 检测到缺少依赖,正在安装... if defined USE_NPM ( call :install_with_npm ) else ( call :install_with_pnpm ) if errorlevel 1 goto error_exit ) REM 检查并安装 run-script-os(解决常见问题) if not exist "node_modules un-script-os" ( echo [修复] 安装 run-script-os... call npm install run-script-os ) REM 强制构建或检查构建状态 if defined FORCE_BUILD ( echo [信息] 强制重新构建项目... call :build_project if errorlevel 1 goto error_exit ) else ( call :check_build if errorlevel 1 goto error_exit ) REM 开发模式或正常启动 if defined DEV_MODE ( echo [信息] 正在以开发模式启动 n8n... echo [警告] 开发模式启动时间较长,请耐心等待... if defined USE_NPM ( call npm run dev ) else ( call pnpm dev ) ) else ( call :start_n8n ) goto end REM ========== 函数定义 ========== :check_os_version REM 检查 Windows 版本兼容性 ver | findstr /i "5\.1\." >nul if not errorlevel 1 ( echo [警告] 检测到 Windows XP,可能存在兼容性问题 ) ver | findstr /i "6\.0\." >nul if not errorlevel 1 ( echo [信息] 检测到 Windows Vista ) ver | findstr /i "6\.1\." >nul if not errorlevel 1 ( echo [信息] 检测到 Windows 7 ) ver | findstr /i "6\.2\." >nul if not errorlevel 1 ( echo [信息] 检测到 Windows 8 ) ver | findstr /i "6\.3\." >nul if not errorlevel 1 ( echo [信息] 检测到 Windows 8.1 ) ver | findstr /i "10\.0\." >nul if not errorlevel 1 ( echo [信息] 检测到 Windows 10/11 ) exit /b 0 :check_and_change_directory REM 检查当前目录是否为 n8n 项目目录 if exist "package.json" if exist "packages" ( echo [信息] 检测到当前已在 n8n 项目目录 exit /b 0 ) REM 获取脚本所在目录(兼容不同 Windows 版本) set "SCRIPT_DIR=%~dp0" if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" REM 如果脚本在 n8n-n8n-1.109.2 目录内 echo %SCRIPT_DIR% | findstr /I /C:"n8n-n8n-1.109.2" >nul if not errorlevel 1 ( echo [信息] 切换到脚本所在的 n8n 项目目录 cd /d "%SCRIPT_DIR%" 2>nul if errorlevel 1 ( REM 兼容旧版 Windows cd "%SCRIPT_DIR%" 2>nul if errorlevel 1 ( echo [错误] 无法切换到目录: %SCRIPT_DIR% exit /b 1 ) ) echo [成功] 已切换到正确的 n8n 项目目录 exit /b 0 ) REM 尝试找到 n8n-n8n-1.109.2 目录 if exist "n8n-n8n-1.109.2\" ( cd n8n-n8n-1.109.2 ) else if exist "..\n8n-n8n-1.109.2\" ( cd ..\n8n-n8n-1.109.2 ) else if exist "..\..\n8n-n8n-1.109.2\" ( cd ..\..\n8n-n8n-1.109.2 ) else ( echo [错误] 未找到 n8n-n8n-1.109.2 目录 echo [信息] 请确保在正确的项目目录下运行此脚本 exit /b 1 ) REM 验证目录结构 if not exist "package.json" ( echo [错误] 目录结构不正确,缺少 package.json exit /b 1 ) if not exist "packages" ( echo [错误] 目录结构不正确,缺少 packages 目录 exit /b 1 ) echo [成功] 已切换到正确的 n8n 项目目录 exit /b 0 :check_dependencies REM 检查 Node.js where node >nul 2>&1 if errorlevel 1 ( REM 尝试常见的 Node.js 安装路径 if exist "C:\Program Files\nodejs\node.exe" ( set "PATH=C:\Program Files\nodejs;%PATH%" ) else if exist "C:\Program Files (x86)\nodejs\node.exe" ( set "PATH=C:\Program Files (x86)\nodejs;%PATH%" ) else ( echo [错误] Node.js 未安装或未在 PATH 中 echo [信息] 请访问 https://nodejs.org 下载安装 exit /b 1 ) ) echo [信息] Node.js 版本: node --version REM 检查包管理器 if not defined USE_NPM ( where pnpm >nul 2>&1 if errorlevel 1 ( echo [警告] pnpm 未安装,尝试使用 npm set "USE_NPM=true" ) else ( echo [信息] 使用 pnpm 作为包管理器 ) ) else ( echo [信息] 使用 npm 作为包管理器 ) echo [成功] 依赖检查通过 exit /b 0 :install_with_pnpm echo [信息] 使用 pnpm 安装依赖... where pnpm >nul 2>&1 if errorlevel 1 ( echo [信息] 正在安装 pnpm... call npm install -g pnpm@8 if errorlevel 1 ( echo [错误] pnpm 安装失败 exit /b 1 ) ) call pnpm install --no-frozen-lockfile exit /b %errorlevel% :install_with_npm echo [警告] 使用 npm 安装(可能不兼容 workspace) echo [信息] 建议安装 pnpm: npm install -g pnpm call npm install --legacy-peer-deps exit /b %errorlevel% :check_port REM 检查端口是否被占用 echo [信息] 检查端口 %CUSTOM_PORT% 是否可用... netstat -ano 2>nul | findstr ":%CUSTOM_PORT%" >nul 2>&1 if not errorlevel 1 ( echo [警告] 端口 %CUSTOM_PORT% 已被占用 echo [信息] 正在查看占用进程... netstat -ano | findstr ":%CUSTOM_PORT%" echo. set /p "kill_process=是否终止占用进程?(y/N): " if /I "!kill_process!"=="y" ( echo [信息] 正在终止占用进程... for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%CUSTOM_PORT%"') do ( taskkill /PID %%a /F >nul 2>&1 if errorlevel 1 ( REM Windows 7 兼容性 tskill %%a >nul 2>&1 ) ) echo [成功] 进程已终止 timeout /t 2 /nobreak >nul 2>&1 if errorlevel 1 ( REM Windows 7 兼容性 ping -n 3 127.0.0.1 >nul ) ) else ( echo [错误] 无法启动 n8n,端口被占用 exit /b 1 ) ) exit /b 0 :stop_existing echo [信息] 正在停止现有的 n8n 进程... REM 停止可能存在的 n8n 相关进程 taskkill /F /IM node.exe /FI "WINDOWTITLE eq *n8n*" >nul 2>&1 taskkill /F /IM node.exe /FI "WINDOWTITLE eq *pnpm*" >nul 2>&1 taskkill /F /IM node.exe /FI "WINDOWTITLE eq *npm*" >nul 2>&1 REM 等待 timeout /t 2 /nobreak >nul 2>&1 if errorlevel 1 ( ping -n 3 127.0.0.1 >nul ) echo [成功] 已停止现有进程 exit /b 0 :setup_environment echo [信息] 正在设置环境变量... set "N8N_PORT=%CUSTOM_PORT%" set "N8N_DEFAULT_LOCALE=zh-CN" set "N8N_SECURE_COOKIE=false" set "DB_SQLITE_POOL_SIZE=5" set "N8N_RUNNERS_ENABLED=true" set "N8N_BLOCK_ENV_ACCESS_IN_NODE=false" set "NODE_OPTIONS=--max-old-space-size=4096" echo [成功] 环境变量已设置 echo - N8N_PORT=%CUSTOM_PORT% echo - N8N_DEFAULT_LOCALE=zh-CN echo - N8N_SECURE_COOKIE=false echo - DB_SQLITE_POOL_SIZE=5 echo - NODE_OPTIONS=--max-old-space-size=4096 exit /b 0 :check_build if not exist "packages\cli\dist\" goto need_build if not exist "packages\core\dist\" goto need_build if not exist "packages\workflow\dist\" goto need_build exit /b 0 :need_build echo [警告] 检测到项目需要构建 set /p "build_project=是否现在构建项目?这可能需要几分钟时间 (y/N): " if /I "!build_project!"=="y" ( call :build_project ) exit /b 0 :build_project echo [信息] 正在构建项目... if defined USE_NPM ( call npm run build > build.log 2>&1 ) else ( call pnpm build > build.log 2>&1 ) if errorlevel 1 ( echo [错误] 构建失败,请查看 build.log type build.log | more exit /b 1 ) echo [成功] 项目构建完成 exit /b 0 :start_n8n echo [信息] 正在启动 n8n 中文版... REM 创建日志文件名(兼容不同日期格式) REM 处理不同的日期格式 set "DATETIME=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%" REM 移除空格和斜杠等特殊字符 set "DATETIME=%DATETIME: =0%" set "DATETIME=%DATETIME:/=%" set "DATETIME=%DATETIME:\=%" set "LOG_FILE=n8n-%DATETIME%.log" echo [信息] 正在启动 n8n 服务... echo [信息] 日志文件: %LOG_FILE% REM 启动 n8n if defined USE_NPM ( start "n8n Server" /B cmd /c "npm start > %LOG_FILE% 2>&1" ) else ( start "n8n Server" /B cmd /c "pnpm start > %LOG_FILE% 2>&1" ) REM 等待启动 echo 等待 n8n 启动 set "count=0" :wait_loop set /a count+=1 if %count% gtr 60 goto start_failed REM 检查端口是否开启 netstat -an 2>nul | findstr ":%CUSTOM_PORT%" | findstr "LISTENING" >nul 2>&1 if not errorlevel 1 goto start_success REM 显示进度 set /p "=." nul 2>&1 if errorlevel 1 ( ping -n 2 127.0.0.1 >nul ) goto wait_loop :start_success echo. echo [成功] n8n 启动成功! echo. echo ========== 启动信息 ========== echo 访问地址: http://localhost:%CUSTOM_PORT% echo 界面语言: 中文 (zh-CN) echo 日志文件: %LOG_FILE% echo ============================= echo. echo [信息] 使用 Ctrl+C 停止服务 echo [提示] 首次访问需要设置账户 echo. pause exit /b 0 :start_failed echo. echo [错误] n8n 启动失败 echo [信息] 查看日志文件: %LOG_FILE% if exist "%LOG_FILE%" ( echo. echo ===== 错误日志 ===== type "%LOG_FILE%" | more ) REM 尝试备用启动方式 echo. echo [信息] 尝试备用启动方式... call npx n8n if errorlevel 1 ( echo [错误] 备用方式也失败 echo. echo 请尝试: echo 1. 运行: npm install run-script-os echo 2. 运行: node packages/cli/bin/n8n ) pause exit /b 1 :show_help echo 用法: %~nx0 [选项] echo. echo 选项: echo -h, --help 显示此帮助信息 echo -d, --dev 使用开发模式启动 (支持热重载) echo -b, --build 强制重新构建项目 echo -c, --check 仅检查系统状态,不启动 echo -p, --port 指定端口 (默认: 5678) echo --skip-deps 跳过依赖检查 echo --npm 使用 npm 替代 pnpm echo. echo 示例: echo %~nx0 # 正常启动 (默认端口 5678) echo %~nx0 -p 8080 # 使用端口 8080 启动 echo %~nx0 -d # 开发模式启动 echo %~nx0 -b # 重新构建并启动 echo %~nx0 --npm # 使用 npm 启动 echo %~nx0 -p 3000 -d # 在端口 3000 上开发模式启动 echo. echo 故障排除: echo 1. 如果 pnpm 安装失败,使用 --npm 选项 echo 2. 如果端口被占用,脚本会提示终止进程 echo 3. 构建失败时查看 build.log 文件 echo. goto end :error_exit echo [错误] 脚本执行失败 echo. echo 常见问题解决: echo 1. 确保 Node.js 版本为 18.x 或 20.x echo 2. 尝试使用管理员权限运行 echo 3. 使用 --npm 选项如果 pnpm 有问题 echo 4. 检查网络连接和代理设置 echo. pause exit /b 1 :end REM 恢复原编码 if defined OLDCP ( chcp %OLDCP% >nul 2>&1 ) endlocal exit /b 0