Files
Agent-n8n/n8n-n8n-1.109.2/start.bat

523 lines
13 KiB
Batchfile
Raw Permalink Normal View History

@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
timeout /t 1 /nobreak >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