🐛 问题描述
v5.0.0 的 start.bat 使用 UTF-8 编码保存,但 Windows cmd.exe 默认使用 GBK/CP936 代码页解析 BAT 文件。
这导致文件中的中文注释和字符串被错误解码,BAT 脚本被逐行作为命令执行,产生大量 "不是内部或外部命令" 错误,程序完全无法运行。
用户报告的错误现象:
'?start-online.bat' 不是内部或外部命令...
'ho.' 不是内部或外部命令...
'敼' 不是内部或外部命令...
'penclaw.json" (' 不是内部或外部命令...
'EXEOPENCLAW_ENTRY" gateway run' 不是内部或外部命令...
'舵嫤鎴?-' 不是内部或外部命令...
舵嫤鎴? 是 UTF-8 编码的中文字符串被 GBK 错误解析的典型乱码特征。
🔍 根本原因
start.bat 中包含大量中文注释和提示(如 rem === 解析脚本目录 ===、echo [ERROR] node\node.exe 未找到!),这些内容以 UTF-8 编码保存。
Windows cmd.exe 在默认代码页 CP936(GBK)下读取 BAT 文件时,会将 UTF-8 多字节序列错误断行,导致:
- 中文注释变为乱码命令
- 部分
set / echo 行被截断,关键变量无法赋值
- 整个脚本逻辑崩溃
✅ 修复方案(二选一)
方案 A(推荐):将 BAT 文件保存为 GBK/ANSI 编码
这是 Windows BAT 文件的标准编码,兼容所有 Windows 版本无需任何额外处理。
操作方式(Git/CI 中执行):
# 用 Python 将 UTF-8 转换为 GBK
python3 -c "
import codecs
with open('start.bat', 'r', encoding='utf-8') as f:
content = f.read()
with open('start.bat', 'w', encoding='gbk') as f:
f.write(content)
"
方案 B(更推荐):去除 BAT 文件中所有中文内容,改为纯英文
这是最彻底的修复,同时提升国际化兼容性:
@echo off
setlocal enabledelayedexpansion
title OpenClaw Portable v5.0
echo.
echo ==========================================
echo OpenClaw Portable v5.0 - Offline Edition
echo ==========================================
echo.
rem === Resolve script directory ===
set "SCRIPT_DIR=%~dp0"
if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
rem === Path configuration ===
set "NODE_EXE=%SCRIPT_DIR%\node\node.exe"
set "NPM_CLI=%SCRIPT_DIR%\node\node_modules\npm\bin\npm-cli.js"
set "OPENCLAW_ENTRY=%SCRIPT_DIR%\openclaw-pkg\node_modules\openclaw\bin\openclaw"
set "OPENCLAW_HOME=%SCRIPT_DIR%\data"
set "GATEWAY_PORT=18789"
set "PATH=%SCRIPT_DIR%\node;%SCRIPT_DIR%\openclaw-pkg\node_modules\.bin;%PATH%"
echo [INFO] Script dir : %SCRIPT_DIR%
echo [INFO] Node dir : %SCRIPT_DIR%\node
echo [INFO] Data dir : %OPENCLAW_HOME%
echo.
rem ============================================
rem [1/5] Check Node.js (must be pre-bundled)
rem ============================================
echo [1/5] Checking Node.js...
if not exist "%NODE_EXE%" (
echo.
echo [ERROR] node\node.exe not found!
echo.
echo This is an OFFLINE package. Node.js should be pre-bundled in node\ directory.
echo Please verify you downloaded the correct offline package:
echo OpenClaw-Portable-v5.0.0-windows-offline.zip
echo.
echo If you want to use online bootstrap mode, use: start-online.bat
echo.
pause
exit /b 1
)
for /f "tokens=*" %%v in ('"%NODE_EXE%" --version 2^>^&1') do set NODE_VER=%%v
echo [OK] Node.js !NODE_VER! ready.
rem ============================================
rem [2/5] Check OpenClaw (must be pre-bundled)
rem ============================================
echo.
echo [2/5] Checking OpenClaw...
if not exist "%OPENCLAW_ENTRY%" (
echo.
echo [ERROR] openclaw not found!
echo.
echo This is an OFFLINE package. OpenClaw should be pre-bundled in openclaw-pkg\ directory.
echo Please verify you downloaded the correct offline package:
echo OpenClaw-Portable-v5.0.0-windows-offline.zip
echo.
pause
exit /b 1
)
echo [OK] OpenClaw ready.
rem ============================================
rem [3/5] Check port availability
rem ============================================
echo.
echo [3/5] Checking port availability...
netstat -aon 2>nul | findstr ":%GATEWAY_PORT%" | findstr "LISTENING" >nul
if not errorlevel 1 (
echo [WARN] Port %GATEWAY_PORT% is in use. Trying fallback port 18790...
set "GATEWAY_PORT=18790"
netstat -aon 2>nul | findstr ":18790" | findstr "LISTENING" >nul
if not errorlevel 1 (
echo [ERROR] Fallback port 18790 is also in use.
echo Please edit GATEWAY_PORT in start.bat manually.
pause
exit /b 1
)
)
echo [OK] Port %GATEWAY_PORT% available.
rem ============================================
rem [4/5] Setup environment
rem ============================================
echo.
echo [4/5] Setting up environment...
if not exist "%SCRIPT_DIR%\data" mkdir "%SCRIPT_DIR%\data"
if not exist "%SCRIPT_DIR%\workspace" mkdir "%SCRIPT_DIR%\workspace"
if not exist "%OPENCLAW_HOME%\openclaw.json" (
echo [INFO] Writing default openclaw.json...
(echo {"gateway":{"mode":"local"}}) > "%OPENCLAW_HOME%\openclaw.json"
)
echo [OK] Environment ready.
rem ============================================
rem [5/5] Start OpenClaw Gateway
rem ============================================
echo.
echo [5/5] Starting OpenClaw Gateway...
echo.
echo URL : http://localhost:%GATEWAY_PORT%
echo Stop : run stop.bat or close this window
echo.
echo ==========================================
echo.
"%NODE_EXE%" "%OPENCLAW_ENTRY%" gateway run
echo.
if errorlevel 1 (
echo [ERROR] Gateway exited with error.
echo 1. Port conflict - netstat -aon | findstr :%GATEWAY_PORT%
echo 2. Corrupt install - delete openclaw-pkg\ and re-run
echo 3. Antivirus block - add to whitelist
) else (
echo [INFO] Gateway stopped normally.
)
echo.
pause
⚠️ 同样受影响的文件
请同时检查并修复以下文件的编码:
stop.bat
check.bat
start-basic.bat
start-online.bat(如果存在)
🔧 防止未来再次出现
在仓库根目录添加 .gitattributes:
# Force BAT files to use CRLF line endings (Windows standard)
*.bat text eol=crlf working-tree-encoding=UTF-8
或者更彻底地,在 .editorconfig 中规定:
[*.bat]
charset = latin1
end_of_line = crlf
这样编辑器会提醒开发者保持 BAT 文件的 ANSI 编码。
优先级
🔴 P0 Hotfix - v5.0.0 完全无法在中文 Windows 系统上运行,影响所有用户。建议立即发布 v5.0.1 修复。
本 issue 由 AI 代码审阅自动生成,如有疑问欢迎讨论。
🐛 问题描述
v5.0.0 的
start.bat使用 UTF-8 编码保存,但 Windows cmd.exe 默认使用 GBK/CP936 代码页解析 BAT 文件。这导致文件中的中文注释和字符串被错误解码,BAT 脚本被逐行作为命令执行,产生大量 "不是内部或外部命令" 错误,程序完全无法运行。
用户报告的错误现象:
舵嫤鎴?是 UTF-8 编码的中文字符串被 GBK 错误解析的典型乱码特征。🔍 根本原因
start.bat中包含大量中文注释和提示(如rem === 解析脚本目录 ===、echo [ERROR] node\node.exe 未找到!),这些内容以 UTF-8 编码保存。Windows cmd.exe 在默认代码页 CP936(GBK)下读取 BAT 文件时,会将 UTF-8 多字节序列错误断行,导致:
set/echo行被截断,关键变量无法赋值✅ 修复方案(二选一)
方案 A(推荐):将 BAT 文件保存为 GBK/ANSI 编码
这是 Windows BAT 文件的标准编码,兼容所有 Windows 版本无需任何额外处理。
操作方式(Git/CI 中执行):
方案 B(更推荐):去除 BAT 文件中所有中文内容,改为纯英文
这是最彻底的修复,同时提升国际化兼容性:
请同时检查并修复以下文件的编码:
stop.batcheck.batstart-basic.batstart-online.bat(如果存在)🔧 防止未来再次出现
在仓库根目录添加
.gitattributes:或者更彻底地,在
.editorconfig中规定:这样编辑器会提醒开发者保持 BAT 文件的 ANSI 编码。
优先级
🔴 P0 Hotfix - v5.0.0 完全无法在中文 Windows 系统上运行,影响所有用户。建议立即发布 v5.0.1 修复。