这里先把话说明白:OpenClaw 这类跑在 WSL 里的 AI 自动化服务框架,卸载从来都不是"控制面板 -> 卸载程序"点一下就完事的。它的本体藏在 Linux 子系统的文件系统里,配置散在 Windows 的用户目录、环境变量、甚至注册表里,如果只删桌面上的快捷方式,过两天你会在wsl --status的报错里、在占用端口的进程里、在右键菜单的残留项里,反复看到它的影子。
这篇教程就是冲着"彻底"两个字去的,覆盖的是一台典型 Windows 机器上 OpenClaw 可能留下的所有痕迹。文章会从卸载前的准备开始,到四个层面的主卸载流程,再到注册表、计划任务、socket 残留这类深层清剿,最后给出验证命令和常见翻车现场的修复方法。不管你是当初用一键脚本部署的,还是手工配了 Node.js + Docker 环境,按这个顺序走一遍,机器基本能回到安装前的状态。
1. 为什么 OpenClaw 卸载不干净:先摸清它在 Windows 里的部署形态
很多人卸载不干净,不是因为操作不对,而是不知道自己在删什么。OpenClaw 在 Windows 上不是单个.exe文件,它默认跑在 WSL2 的发行版里,通过 Linux 子系统访问主机资源,同时依赖 Node.js 运行时、外部容器服务、一堆 npm 全局包,还有 Windows 侧的配置文件和 PowerShell 环境变量。这几个层面相互交叉,删漏任何一个都会留下"半死不活"的残留。
1.1 OpenClaw 在 Windows 上通常装在哪几层
我把一台装了 OpenClaw 的 Windows 机器拆开看,它至少会在下面几个位置落东西:
- WSL 子系统内部:OpenClaw 的工作目录(常见如
~/openclaw或~/claw)、配置文件config.yaml、日志目录、由包管理器拉取的依赖文件,还有它注册的 systemd 服务或后台进程。 - Windows 用户目录:
%USERPROFILE%\.openclaw、%APPDATA%\openclaw、%LOCALAPPDATA%\openclaw这类隐藏配置目录,存的是 token、会话数据、浏览器集成配置。 - Docker / 容器层:如果部署时选择用容器跑数据库或中间件(OpenClaw 对接 Elasticsearch、Redis 是常见组合),那 Docker Desktop 里会挂着对应的镜像、容器和数据卷。
- 环境变量与 PATH:安装脚本通常会往用户级 PATH 里追加
openclaw可执行文件路径,还会在 PowerShell profile 里写初始化脚本或别名。 - 计划任务与自启动项:需要常驻响应的部署方式会在任务计划程序里注册开机自启任务,或者往启动文件夹塞快捷方式。
你对照这个清单检查自己机器,基本就能明白为什么之前删完还有残留。
1.2 哪些"共用件"不能随便删:别把地板砖和家具一起扔
要特别提醒一句:OpenClaw 专属的东西要清干净,但共用件不能跟着删。比如你机器上可能同时跑着其他 JavaScript 项目,那全局的 Node.js 运行时不能因为卸载 OpenClaw 就移除;Docker Desktop 如果还起着别的容器(比如其他团队项目),卸载时只清 OpenClaw 相关的镜像和容器即可,别去卸载整个 Docker 服务;WSL2 子系统本身在 Windows 里还承担着其他职责,除非你确定 OpenClaw 是它唯一的用途,否则不建议执行wsl --unregister把整个发行版删掉,那样会误伤子系统里其他所有数据。
这条边界想清楚,后面每一步删什么、保留什么,判断起来就顺手了。
2. 卸载前的预备动作:备份配置、停服务、盘点残留
动手之前千万别跳过准备步骤。OpenClaw 的配置里往往存着各类服务的连接凭证、会话 token,一旦删了没法找回。我见过有人直接删目录,删完才想起来里面有一个重要的接入凭据没备份,最后只能去服务端重新生成。这种事其实完全可以避免。
2.1 备份配置文件的三种方式
方式一:整目录打包(最省事)
在 Windows 命令行或 PowerShell 里,把两个主要配置目录分别打成压缩包:
Compress-Archive -Path "$env:USERPROFILE\.openclaw" -DestinationPath "$env:USERPROFILE\Desktop\openclaw-backup.zip" Compress-Archive -Path "$env:APPDATA\openclaw" -DestinationPath "$env:APPDATA\openclaw-backup.zip" -Force方式二:从 WSL 内部备份
如果配置主体在 WSL 里,先进入子系统再打包:
cd ~ tar -czf openclaw-backup.tar.gz .openclaw openclaw 2>/dev/null cp openclaw-backup.tar.gz /mnt/c/Users/你的用户名/Desktop/方式三:只备份关键文件
如果只想留核心配置,只拷贝config.yaml、.env、credentials.json这类文件也行。注意.env和 token 文件在 Linux 下通常是隐藏文件,用ls -la才看得到。
备份做完,把备份包放到 OpenClaw 管不到的位置(比如桌面、D 盘),再继续下一步。
2.2 停服务:先让进程安静下来再拆
活跃进程会锁住文件,导致删除时报"文件被占用"。在管理员 PowerShell 里依次执行:
# 停掉所有可能属于 OpenClaw 的 node 进程(这一步要谨慎,确认没有其他 Node 项目在跑) Get-Process node -ErrorAction SilentlyContinue | Stop-Process -Force # 列出所有 WSL 发行版,确认用的是哪个 wsl --list --verbose # 关闭 WSL 里正在运行的发行版(OPENCLAW 是发行版名,按实际情况替换) wsl --terminate OpenClaw如果你用的是 Docker 容器部署,顺便把容器停掉:
docker ps --filter "name=openclaw" --format "table {{.Names}}\t{{.Image}}" docker stop $(docker ps -q --filter "name=openclaw")这一步做扎实,后面删除目录、删除镜像时遇到权限问题的概率会小很多。
2.3 自查清单:一台典型机器上会留下什么
在动手之前,建议你先跑一遍下面的盘点命令,把 OpenClaw 在系统里的痕迹全部列出来:
# 1. 检查用户主目录和 AppData 下的相关目录 $paths = @( "$env:USERPROFILE\.openclaw", "$env:APPDATA\openclaw", "$env:APPDATA\npm\node_modules\openclaw", "$env:LOCALAPPDATA\openclaw", "$env:USERPROFILE\openclaw" ) $paths | Where-Object { Test-Path $_ } # 2. 检查 PATH 里是否残留 openclaw 目录 $env:Path -split ';' | Where-Object { $_ -match 'openclaw|claw' } # 3. 检查 WSL 子系统里的部署目录 wsl -d OpenClaw -- bash -c "ls -la ~ | grep -i claw; which openclaw 2>/dev/null" # 4. 检查计划任务 Get-ScheduledTask | Where-Object { $_.TaskName -match 'openclaw|claw' } | Select-Object TaskName, State运行完这些,你对"这台机器上 OpenClaw 到底埋了多少雷"就有数了。建议把结果截图或记下来,后面每清一项就对照核销一项。
3. 主卸载流程:从上到下清除四个层面的 OpenClaw 痕迹
准备工作做完,进入正式卸载。我按"子系统 -> 容器 -> Windows 应用目录 -> 环境变量"四个层面逐层清理,每层之间有依赖顺序,尽量别跳着来。
3.1 删除 WSL 里的 OpenClaw 工作区与服务配置
先进入 WSL 子系统,删掉 OpenClaw 的工作目录和用户级配置:
# 进入子系统,切换到部署 OpenClaw 的用户 wsl -d OpenClaw # 查看部署目录和配置文件位置 ls -la ~ | grep -i claw ls -la ~/.config | grep -i claw 2>/dev/null # 删除主目录下的部署文件夹(按实际名称替换) rm -rf ~/openclaw ~/.openclaw ~/.config/openclaw 2>/dev/null # 如果有 systemd service 或 init 脚本,一并移除 rm -f ~/.config/systemd/user/openclaw.service 2>/dev/null rm -f /etc/systemd/system/openclaw.service 2>/dev/null如果安装时往/usr/local/bin或/usr/bin里放过可执行文件软链,也一起删:
sudo rm -f /usr/local/bin/openclaw /usr/bin/openclaw 2>/dev/null目录删干净后,检查一下~/.bashrc、~/.zshrc或~/.profile里有没有 OpenClaw 加进去的 alias、PATH 或自动启动命令。这一步很容易漏,很多人删了目录,但每次打开终端还是会有"openclaw: command not found"的报错,就是因为 shell 配置文件里还引用着它。
3.2 清理 Docker 容器、镜像与数据卷
如果 OpenClaw 部署时用了 Docker(常见的是用容器跑数据库或作为服务宿主),接下来清容器层。注意只清 openclaw 相关的,保留其他项目的容器:
# 查看所有容器,确认哪些属于 OpenClaw docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" # 删除相关容器(按实际容器名替换) docker rm -f openclaw-container # 删除相关镜像 docker images | Select-String "openclaw|claw" docker rmi openclaw-image # 删除相关数据卷(注意:数据卷删除不可恢复,确认无误再执行) docker volume ls | Select-String "openclaw" docker volume rm openclaw-data如果 OpenClaw 只是把 Docker 当作中间件的载体,那相关的中间件容器也可以顺手清掉。清完可以执行docker system df看看空间释放情况。
3.3 删除 Windows 侧的目录与配置文件
回到 Windows 侧,删除用户主目录和 AppData 下的残留目录:
$paths = @( "$env:USERPROFILE\.openclaw", "$env:APPDATA\openclaw", "$env:LOCALAPPDATA\openclaw", "$env:USERPROFILE\openclaw", "$env:USERPROFILE\.claw", "$env:APPDATA\npm\node_modules\openclaw" ) foreach ($p in $paths) { if (Test-Path $p) { Write-Host "删除 $p" Remove-Item -Path $p -Recurse -Force } }如果安装时用的是带桌面 GUI 的版本,还可能在%LOCALAPPDATA%\Programs\openclaw或%ProgramFiles%\openclaw下装了应用本体,也要一并删除。同时检查开始菜单里的快捷方式和桌面快捷方式,它们往往指向已经删除的路径,留着只是摆设,但会让系统显得很脏。
3.4 清理环境变量、PATH 与 npm 全局包
最后处理环境层面的残留。先清理 npm 全局包中的 OpenClaw 本体和它带来的 CLI 命令:
# 查看全局 npm 包里有没有 openclaw 相关模块 npm list -g --depth=0 | Select-String "openclaw|claw" # 卸载全局包 npm uninstall -g openclaw # 如果还有相关辅助包,一并卸载 npm uninstall -g @openclaw/cli 2>$null然后清理 PATH 和环境变量。打开"系统属性 -> 环境变量",在用户变量和系统变量的 Path 里,把包含openclaw字样的条目删掉。用命令行也可以查证:
# 查看当前进程的 Path,确认哪些条目包含 openclaw $env:Path -split ';' | Where-Object { $_ -match 'openclaw|claw' } # 通过注册表查看持久化的用户 PATH 条目 Get-ItemProperty "HKCU:\Environment" | Select-Object -ExpandProperty Path如果安装脚本还把OPENCLAW_HOME之类的自定义变量写进了用户或系统环境变量,在"环境变量"对话框里找到并删除。检查方法:
[System.Environment]::GetEnvironmentVariable('OPENCLAW_HOME', 'User') [System.Environment]::GetEnvironmentVariable('OPENCLAW_HOME', 'Machine')这一步做完,主流程基本结束。但注意:删掉环境变量后,要重新打开终端窗口才生效,旧窗口里还挂着删除前的环境。
4. 深层清剿:注册表、临时目录与终端 profile 里的暗雷
主流程走完,系统里八成还有一个或多个"隐藏关卡"。这些地方普通卸载工具根本不会碰,但恰恰是它们让系统变得"删了像没删一样"。
4.1 注册表残留为什么值得查一遍
Windows 注册表是很多卸载程序的盲区。OpenClaw 如果带 GUI 或文件关联(比如关联了某种配置文件格式),就会往注册表里写东西。常见的残留位置有三个:
# 卸载信息里通常记录着软件名和卸载入口 Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Get-ItemProperty | Where-Object { $_.DisplayName -match 'openclaw|claw' } # 用户级卸载记录 Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Get-ItemProperty | Where-Object { $_.DisplayName -match 'openclaw|claw' } # 启动项注册表(Run 键) Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" | Format-List Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" | Format-List查到带openclaw字样的键值后,用reg delete删除。以用户级卸载信息为例:
Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall" | Where-Object { (Get-ItemProperty $_.PSPath).DisplayName -match 'openclaw' } | ForEach-Object { Remove-Item -Path $_.PSPath -Recurse -Force }对注册表操作要格外小心:只动明确匹配 openclaw/claw 的键,不要漫无目的地删。如果看某个键不确定它属于谁,宁可先留着,也不要盲目删除。
4.2 终端启动脚本、PowerShell 模块与计划任务
终端启动脚本是另一个常见暗雷。PowerShell 的 profile 文件位置是$PROFILE,安装脚本喜欢在这里追加自动加载模块或设置 OPENCLAW 环境。检查方式:
# 打开 PowerShell profile 检查内容 notepad $PROFILE # 或者直接查看其中是否包含 openclaw 字样 Select-String -Path $PROFILE -Pattern "openclaw|claw" -SimpleMatch如果有,手动删掉对应行。注意 profile 文件可能在Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1或Documents\PowerShell\Microsoft.PowerShell_profile.ps1,取决于你用的 PowerShell 版本(5.1 还是 7+)。两个位置都查一下更稳妥。
计划任务也要查:
# 查询所有计划任务并筛选 Get-ScheduledTask | Where-Object { $_.TaskName -match 'openclaw|claw' -or $_.Actions.Execute -match 'openclaw|claw' } | ForEach-Object { Write-Host "删除计划任务: $($_.TaskName)" Unregister-ScheduledTask -TaskName $_.TaskName -Confirm:$false }另外,如果部署时在 Windows 侧创建了 Windows 服务(比如通过 NSSM 包装的常驻进程),用sc query openclaw查一下服务列表,存在的话用管理员权限删除:
sc.exe stop openclaw sc.exe delete openclaw如果服务名不叫 openclaw 但可执行路径指向 OpenClaw 目录,用Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'openclaw' }查到后同样删除。
4.3 端口被占用怎么办:socket 残留排查
很多人在卸载后发现"端口被占用"的报错,其实这是 OpenClaw 相关进程留下 socket 监听未释放,或者 Windows 的端口排除规则里还残留着它的端口。热搜词里就有"windows 关闭端口号",说明这是卸载之后最常见的问题之一。
排查命令:
# 查看端口占用情况(把 3010 换成你部署时配置的端口) netstat -ano | Select-String "3010" # 按 PID 查看是哪个进程 Get-Process -Id (这里填上一步查到的 PID) # 如果该 PID 已经没有对应进程,说明 socket 处于 TIME_WAIT 状态 # 通常等几分钟自动消失;如果持久占用,检查 docker-proxy 或 wslrelay Get-Process -Name docker-proxy -ErrorAction SilentlyContinue | Select-Object Id, ProcessName如果是 Docker 的端口映射残留(容器已删但 docker-proxy 还占用端口),重启 Docker Desktop 一般能释放。如果始终释放不了,再去"资源监视器 -> 网络 -> 侦听端口"里查一遍对应的 PID,确认对应进程是否真的还在跑。
5. 卸载后验证与常见翻车现场修复
整个清理流程走完,最后一步是验证"是不是真的干净了"。这一节不只是给几条命令,而是把最容易翻车的几个点单独拿出来讲透,因为我在实际处理中见过大量同类问题,十个里面有八个是同一个原因。
5.1 验证卸载彻底的三条命令与检查顺序
验证顺序建议按"命令是否可用 -> 目录是否残留 -> 进程和端口是否清空 -> WSL 状态是否正常"来走:
# 1. 检查命令是否还能被找到(应显示无法识别) Get-Command openclaw -ErrorAction SilentlyContinue where.exe openclaw # 2. 检查主要目录是否残留 Test-Path "$env:USERPROFILE\.openclaw" Test-Path "$env:APPDATA\openclaw" Test-Path "$env:USERPROFILE\openclaw" # 3. 检查进程 Get-Process | Where-Object { $_.ProcessName -match 'openclaw|claw' } # 4. 检查 WSL 状态,确认没有报错 wsl --status wsl --list --verbose四条命令都返回"无结果"或正常状态,卸载就算基本干净了。特别是wsl --status,当初安装部署时如果脚本对 WSL 配置做过修改(比如改过默认版本、注册过镜像),卸载后运行这一条能帮你确认子系统本身没有因此受损。
5.2 最容易翻车的三个坑:WSL 报错、权限拒绝、路径锁死
坑一:wsl --status报错或显示环境已损坏
这不是卸载带来的问题,往往是你之前部署 OpenClaw 时,脚本修改了/etc/wsl.conf或注册了 systemd 服务,卸载时我们删了服务文件但没恢复配置。处理方式:进入 WSL 发行版,检查/etc/wsl.conf里有没有 openclaw 相关段落,确认是默认状态即可。如果整个 WSL 子系统确实被搞乱了,且里面没有需要保留的数据,最后手段是执行wsl --unregister OpenClaw把发行版整个移除,再重新安装一个干净的发行版。这个操作不可逆,用了之前请确认子系统里没有其他个人数据。
坑二:删除文件时提示"权限不足"或"文件被占用"
优先检查是否有终端窗口还停留在 WSL 子系统的目录里,或者 Docker Desktop、VS Code 等程序还持有该目录的句柄。关掉所有可能占用路径的程序后再删。如果还不行,用管理员权限的 PowerShell 重试。有些隐藏文件或系统属性文件,先取消只读属性再删除:
attrib -r -s -h "C:\path\to\openclaw\*.*" /s /d Remove-Item -Path "C:\path\to\openclaw" -Recurse -Force坑三:删除后 PATH 里还有残留但终端不报错
因为 PATH 的修改只对之后新开的进程生效。删完环境变量后务必彻底退出并重新打开终端,如果有 VS Code 之类的编辑器开着,也一并重启,否则它的集成终端里还是会看到旧的环境变量。这是"为什么我清完了还在报错"的高频原因。
5.3 准备重装的话,这些事一定要提前知道
如果你想在清干净之后重新部署 OpenClaw,我建议你在卸载完成后做一次快照式检查:记录自己的系统版本、WSL 内核版本、Node.js 版本,这些参数在重装时最容易踩兼容性的坑。另一个建议是:重装前先确认好这次要用哪种部署形态(纯 WSL 还是 Docker 容器),不同形态产生的残留位置不一样,以后卸载时的清理路径也不一样。选一种方式走到黑,别两种混着来,混着部署是残留的最大来源。
我实际见过最惨的情况是:先用了脚本一键部署,后来嫌不好用又改成 Docker 部署,中间又升级过几次版本,最后卸载时 WSL 里、容器里、Windows 目录里各有一份残留,排查花了一整个下午。所以如果你准备重装,请务必想清楚部署方式再动手。
写在最后的一点实际体会
做了这么多年的环境清理,我最深的感受是:卸载比安装更能检验一台机器是否健康。安装是一路"放东西",卸载是"把东西拿干净",而 OpenClaw 这类跨 Windows 和 WSL 两个世界部署的框架,天然就是残留大户。每次清理我都是抱着"宁可多删十处,不可放过一处"的心态,但同时又把"共用件不误伤"这条红线绷得紧紧的。
最后分享一个我个人的操作习惯:清理过程中每执行完一个大步骤,就把命令输出截图存一下。别嫌麻烦,真遇到"清完还报错"的时候,这些截图能帮你快速定位到底哪一步没走干净。另外,在做任何不可逆删除(尤其是注册表和wsl --unregister)之前,强制自己先做一次备份,这个习惯救过我很多次。照着你机器上的实际情况把上面的步骤走一遍,OpenClaw 基本能从你的 Windows 系统里干干净净地退场。