## 一、问题情况
整理 OpenClaw 配置时,发现有个自带的模板 Skill(taskflow-inbox-triage)没什么用,想让对话 AGENT 直接禁用它。用 openclaw config set 操作:
|
1 |
openclaw config set skills.entries.taskflow-inbox-triage.enabled false |
结果报错:
|
1 2 |
Config write rejected: C:\Users\用户名\.openclaw\openclaw.json (size-drop:24595->8034) Error: Config write rejected: C:\Users\用户名\.openclaw\openclaw.json (size-drop:24595->8034) |
config set 被拒绝了,提示写入的配置大小从 24595 字节掉到了 8034 字节,少了将近 2/3。
## 二、错误的尝试
想着是不是直接改 JSON 文件就行了,于是用 PowerShell 读取 openclaw.json,加上配置项后用 ConvertTo-Json 写回去:
|
1 2 3 |
$config = Get-Content openclaw.json -Raw | ConvertFrom-Json $config.skills.entries | Add-Member -NotePropertyName "taskflow-inbox-triage" -NotePropertyValue @{enabled=$false} $config | ConvertTo-Json -Depth 10 | Set-Content openclaw.json -Encoding UTF8 |
Gateway 重启后直接报错,服务起不来了。不仅没解决问题,反而把配置搞坏了。
## 三、问题原因
排查发现三个问题:
1. **BOM 头问题** — PowerShell 的 Set-Content -Encoding UTF8 默认会加上 BOM 头(EF BB BF 三个字节)。OpenClaw 读取配置文件时没处理 BOM,导致解析失败。如果用 -Encoding UTF8NoBOM 就不会有这个问题。
2. **中文路径编码问题** — openclaw.json 存放在 C:\Users\用户名\.openclaw\ 下,中文路径在 PowerShell 的 Get-Content 和 Set-Content 之间经过了多次编码转换。OpenClaw 读回配置文件时编码不对,解析失败。
3. **ConvertTo-Json 序列化丢失数据** — ConvertTo-Json 在处理深层嵌套的对象时,默认的 -Depth 参数(2)不够,即使指定了 -Depth 10,某些特殊类型和引用的序列化方式也和原文件不一致,导致文件内容被截断(24KB → 8KB)。
## 四、正确的做法
用 OpenClaw 自带的命令来操作配置,不要手贱改 JSON:
查看配置:
|
1 |
openclaw config get skills.entries |
设置配置:
|
1 |
openclaw config set skills.entries.xxx.enabled true |
如果 config set 被拒绝,可以用 openclaw config edit 来打开编辑:
|
1 |
openclaw config edit |
这样 OpenClaw 会在保存后自动校验和重新加载配置,避免编码和格式问题。
## 五、恢复方法
好在 OpenClaw 有备份机制,被拒绝的写入内容会保存到 .rejected 文件:
|
1 |
C:\Users\用户名\.openclaw\openclaw.json.rejected.时间戳 |
把之前的正常配置恢复回来,重启 Gateway 就好了。
## 六、总结
OpenClaw 的配置不要用外部工具直接修改,尤其不要用 PowerShell 的 ConvertTo-Json 序列化后写回去。应该用 OpenClaw 自带的 config 命令来操作。如果 config set 报错,就用 config edit 打开编辑。