Hermes Agent 是 Nous Research 开发的 AI 智能体,可以在 WSL2 中运行并提供 Web Dashboard 界面。但每次启动都需要打开 WSL2 终端,运行命令,然后手动打开浏览器访问 http://127.0.0.1:9119,步骤繁琐。

我们希望在 Windows 桌面上双击一个图标,就能自动完成:
创建一个 .bat 批处理文件,利用 Windows 的 wsl 命令启动 WSL2 中的 Hermes,并用 curl 检测端口状态。
| 要点 | 实现方式 | |
|---|---|---|
| 检测是否运行 | `curl -s -o nul -w "%%{http_code}" http://127.0.0.1:9119/ 2>nul ^ | findstr "200"` |
| 判断结果 | if not errorlevel 1(errorlevel==0 表示返回200) | |
| 后台启动 WSL2 | start /min wsl -d Ubuntu-22 --user sanlin -- bash -c "..." | |
| 等待就绪 | :waitloop + timeout /t 1 每秒轮询,最多30秒 |
这部分是本文的核心价值,记录了编写这个不到30行 .bat 文件时踩的所有坑。
.bat 文件中,%errorlevel% 在 (...) 代码块里只会在进入代码块时解析一次,后续变化不会反映到 %errorlevel% 里。
|
1 2 3 4 |
if condition ( some_command :: 这个命令改变了 errorlevel echo %errorlevel% :: ? 这里永远是进入代码块时的值,不是最新值! ) |
解决方法:用 setlocal enabledelayedexpansion 开启延迟环境变量扩展,然后用 !errorlevel! 获取实时值。
如果直接用 !errorlevel! 而没有在文件开头加 setlocal enabledelayedexpansion,cmd.exe 会报错。
|
1 2 3 4 5 6 7 |
:: ? 错误写法(会报错) @echo off echo !errorlevel! :: ? 正确写法 @echo off setlocal enabledelayedexpansion echo !errorlevel! |
同理,因为 %errorlevel% 只解析一次,判断结果不准确。
解决方法:用 if not errorlevel 1(经典写法,不需要延迟扩展)。
if not errorlevel 1 的含义是:如果 errorlevel 不小于 1(即 errorlevel == 0)
这是 Windows .bat 脚本的经典 idiom,推荐优先使用。
在 .bat 文件中,%% 表示一个 literal % 字符。所以当我们要将 %{http_code} 传递给 curl 的 -w 参数时,必须写成 %%{http_code}。
|
1 2 3 4 5 |
:: 在 .bat 文件里这样写: curl -s -o nul -w "%%{http_code}" http://127.0.0.1:9119/
:: cmd.exe 执行时,%%{http_code} → %{http_code} :: 这正是 curl -w 参数期望的格式化字符串 |
如果在 .bat 文件里直接写 %{http_code},cmd.exe 会试图将 {http_code} 当作环境变量来展开,导致错误。
最开始我用了 wsl -d Ubuntu-22 -- ... 直接启动,但发现 .bat 文件执行完毕后,WSL 进程也随之退出(因为 .bat 是同步等待子进程结束的)。
解决方法:用 start /min wsl ... 在独立的最小化窗口中启动 WSL,这样:
timeout /t 1 /nobreak 在某些 Windows 版本里会等待用户按键。在等待循环里应该用 timeout /t 1 >nul 静默等待。
将以下内容保存为 Hermes Web.bat,放到桌面:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
@echo off chcp 65001 >nul 2>&1 setlocal EnableDelayedExpansion title Hermes Web Dashboard
echo ============================================ echo Hermes Agent - Web Dashboard Launcher echo ============================================ echo.
:: Check if already running curl -s -o nul -w "%%{http_code}" http://127.0.0.1:9119/ 2>nul | findstr "200" >nul if not errorlevel 1 ( echo [OK] Already running, opening browser... start http://127.0.0.1:9119 exit /b 0 )
echo [INFO] Starting Hermes Dashboard in WSL2... start /min wsl -d Ubuntu-22 --user sanlin -- bash -c "cd ~/.hermes/hermes-agent && source .venv/bin/activate && hermes dashboard --host 0.0.0.0 --insecure --tui --no-open"
echo [INFO] Waiting for dashboard to start... timeout /t 5 >nul
:waitloop curl -s -o nul -w "%%{http_code}" http://127.0.0.1:9119/ 2>nul | findstr "200" >nul if not errorlevel 1 ( echo [OK] Dashboard is ready! start http://127.0.0.1:9119 exit /b 0 ) timeout /t 1 >nul goto waitloop |
代码说明:
| 场景 | 行为 |
|---|---|
| Dashboard 已在运行 | 直接打开浏览器访问 http://127.0.0.1:9119 |
| Dashboard 未运行 | 在后台(最小化窗口)启动 WSL2 中的 Hermes,等待 5 秒后开始轮询,检测到就绪后立即打开浏览器 |
通过 .bat 脚本 + wsl 命令,可以在 Windows 上优雅地启动 WSL2 中的 Hermes Agent,并自动打开浏览器访问 Web Dashboard。
核心知识点: