Skip to content

[BUG v5.0.0] start.bat 编码为 UTF-8,导致中文 Windows 系统乱码并完全无法运行 #44

@SonicBotMan

Description

@SonicBotMan

🐛 问题描述

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 多字节序列错误断行,导致:

  1. 中文注释变为乱码命令
  2. 部分 set / echo 行被截断,关键变量无法赋值
  3. 整个脚本逻辑崩溃

✅ 修复方案(二选一)

方案 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 代码审阅自动生成,如有疑问欢迎讨论。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug🐛 Bug - Something isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions