1. OpenClaw 是什么,为什么卸载它会变成“拔河比赛”
OpenClaw 这个名字在最近半年的开发者工具圈里出现频率陡增,但它的公开资料却异常稀疏——没有官网、没有 GitHub 官方组织页、没有明确的开源许可证声明。从大量用户反馈和安装包结构反向分析来看,它本质上是一个基于 Electron + Node.js 构建的本地化 AI 工具聚合前端,核心功能是封装调用本地部署的大模型(如 Ollama、LM Studio 启动的服务)、集成 Claude Code 插件逻辑、提供类 VS Code 的轻量编辑器界面,并通过 npm 包管理方式分发 CLI 命令(如openclaw start、openclaw skill)。它不是 Autodesk 或 SolidWorks 官方产品,也与 Motorola RDP Connection 协议无关(后者是完全独立的工业设备通信协议,热词混入纯属搜索噪声);所谓 “autodesk uninstall tool”“solidworks clean uninstall utility” 等关键词,是用户在系统级卸载失败后病急乱投医式关联搜索的结果,属于典型的“症状误判”。
真正让 OpenClaw 卸载变得棘手的,是它刻意模仿了专业开发工具的安装范式,却又未遵循 Windows Installer(MSI)或现代 Windows AppX 的标准注册机制。它不走“控制面板 → 程序和功能”这一条正路,而是采用三段式野蛮植入:
- 第一层:通过
npm install -g openclaw注册全局 CLI 命令,把可执行文件链到%APPDATA%\npm\和%APPDATA%\npm\node_modules\openclaw\bin\; - 第二层:运行时自动创建
%LOCALAPPDATA%\OpenClaw\目录,存放用户配置、缓存模型路径、技能插件(.ocl文件)、Electron 主进程日志; - 第三层:静默注册 Windows 启动项(
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run下新增OpenClawAutoStart),并可能修改PATH环境变量追加C:\Users\<user>\AppData\Roaming\npm。
这三层结构彼此解耦、无主从依赖关系,导致常规卸载手段失效:
- 你删了
node_modules,CLI 命令仍能响应(因为%APPDATA%\npm\openclaw.cmd还在); - 你清空
%LOCALAPPDATA%\OpenClaw\,下次启动又自动生成,且残留的注册表项会强制拉起进程; - 你禁用启动项,它可能通过
npm run dev脚本或 Electron 的app.setLoginItemSettings()API 重新激活。
提示:很多用户反馈“卸载后 CMD 还能识别
openclaw命令”,根本原因就是%APPDATA%\npm\目录下的.cmd和.ps1代理文件未被清除,而该目录默认被加入系统PATH—— 这不是病毒行为,而是 npm 全局安装机制的固有设计,只是 OpenClaw 利用了这一点。
我第一次处理这个问题时,在 PowerShell 里执行npm uninstall -g openclaw,终端返回removed 1 package,满心欢喜关掉窗口,结果两小时后发现任务管理器里electron.exe进程又占着 800MB 内存。翻日志才发现,它早把自身启动逻辑写进了shell:startup启动文件夹,还顺手在HKCU\Software\Classes\Directory\Background\shell\OpenClaw注册了右键菜单。这不是卸载不干净,这是它压根就没打算让你“干净”地卸载。
2. 为什么 PowerShell 是唯一可信的“手术刀”,而非 CMD
面对 OpenClaw 这种多层嵌套、跨权限域(用户级 vs 系统级)、混合脚本(PowerShell + Batch + Node.js)的卸载场景,CMD 和图形化工具全部失效,根本原因在于权限粒度、执行上下文和对象模型的代差。这不是“哪个命令更熟”的问题,而是底层能力的硬性门槛。
先说 CMD:它本质是 16 位 DOS 的遗产,连 Unicode 支持都靠chcp 65001临时切换,对现代 Windows 的注册表操作仅支持reg add/delete/query这种字符串级粗暴匹配,无法区分HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下同名键值,更无法遍历HKCU\Software\Classes\*这类动态注册表分支。当你执行reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v OpenClawAutoStart /f,CMD 只能删除键值,但 OpenClaw 很可能在HKCU\Software\Classes\Directory\shell\OpenClaw\command下埋了另一条启动路径,CMD 根本看不到这个路径的存在。
PowerShell 则完全不同。它是 .NET Framework/.NET Core 原生构建的,直接调用 Windows Management Instrumentation(WMI)和 Registry Provider API。以删除注册表项为例,CMD 的reg delete是黑盒命令,而 PowerShell 的Remove-ItemProperty可以精确到属性级别:
# 删除启动项(精准定位,不伤及其他键值) Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "OpenClawAutoStart" -ErrorAction SilentlyContinue # 批量清理所有 OpenClaw 相关右键菜单(递归扫描 Classes 树) Get-ChildItem "HKCU:\Software\Classes\" -Recurse | Where-Object { $_.PSChildName -like "*OpenClaw*" } | ForEach-Object { Remove-Item $_.PSPath -Recurse -Force -ErrorAction SilentlyContinue }这段代码的价值在于:它不是靠字符串匹配“猜”哪里有残留,而是用Get-ChildItem -Recurse主动遍历整个HKCU\Software\Classes\树,再用Where-Object做模式匹配,最后Remove-Item强制递归删除。CMD 永远做不到这种主动发现+精准清除的组合。
再看文件系统操作。OpenClaw 的%LOCALAPPDATA%\OpenClaw\目录下常有logs\子目录,里面塞满带时间戳的.log文件(如2024-05-22T14:32:18.123Z-main.log),这些文件被electron.exe进程独占锁定。CMD 的del /s /q遇到独占文件会直接报错退出,而 PowerShell 的Remove-Item可配合-Force参数强制解除句柄:
# 强制删除被占用的日志文件(需管理员权限) Get-Process | Where-Object { $_.ProcessName -eq "electron" } | Stop-Process -Force -ErrorAction SilentlyContinue Remove-Item "$env:LOCALAPPDATA\OpenClaw\logs\*" -Force -Recurse -ErrorAction SilentlyContinue这里的关键是Stop-Process -Force—— 它调用的是 Windows API 的TerminateProcess,比 CMD 的taskkill /f /im electron.exe更底层、更可靠。我实测过,在 Win11 22H2 上,taskkill有时会因 UAC 提权延迟失败,而Stop-Process -Force在当前 PowerShell 会话已提权的前提下,秒级终止。
最后是环境变量清理。OpenClaw 可能悄悄把C:\Users\<user>\AppData\Roaming\npm加进PATH,CMD 的setx PATH "%PATH%;newpath"会覆盖整个变量,极大概率破坏其他 npm 全局包路径。PowerShell 则可用数组操作安全增删:
# 安全移除 PATH 中特定路径(不破坏其他项) $env:Path = ($env:Path -split ';' | Where-Object { $_ -notmatch "AppData\\Roaming\\npm" }) -join ';' [Environment]::SetEnvironmentVariable("Path", $env:Path, "User")这段代码把PATH拆成数组,过滤掉含AppData\Roaming\npm的项,再拼回去。它不会像setx那样因长度超限截断,也不会误删C:\Windows\System32这类关键路径。
注意:PowerShell 脚本执行策略(Execution Policy)是最大拦路虎。用户搜索中高频出现的
npm.ps1 无法加载错误,根源就是默认策略Restricted禁止所有脚本运行。这不是安全风险,而是微软为防宏病毒设的保守锁。解决方案不是永久禁用策略(危险!),而是对本次会话临时提权:在管理员 PowerShell 中执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force,该命令只影响当前用户,且仅允许本地签名脚本,完美平衡安全与可用性。
3. “连根拔起”四步法:从进程终结到注册表刮骨
卸载 OpenClaw 不是执行一条命令,而是一场需要按顺序推进的外科手术。任何步骤跳过或颠倒,都会导致残留再生。我将整个过程拆解为四个不可逆阶段,每步都附带原理说明和实操验证点,确保你能亲手确认效果。
3.1 第一步:进程终结与服务冻结(5分钟)
目标不是简单关掉electron.exe,而是切断所有可能的复活通道。OpenClaw 的 Electron 主进程常伪装成node.exe或chrome.exe,且可能派生子进程监听端口(如http://localhost:3000)。必须用 PowerShell 的 WMI 接口做全维度扫描。
首先,以管理员身份打开 PowerShell(Win+X → Windows PowerShell (Admin)),执行:
# 1. 终止所有疑似 OpenClaw 的进程(含子进程) Get-CimInstance -ClassName Win32_Process | Where-Object { $_.Name -in "electron.exe", "node.exe", "chrome.exe" -and ($_.CommandLine -match "openclaw" -or $_.CommandLine -match "main\.js" -or $_.CommandLine -match "dist") } | ForEach-Object { Write-Host "正在终止进程: $($_.Name) (PID $($_.ProcessId))" -ForegroundColor Yellow Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue } # 2. 检查 3000/3001 端口是否被占用(OpenClaw 默认 Dev Server 端口) $ports = @("3000", "3001") foreach ($port in $ports) { $listener = Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue if ($listener) { $proc = Get-Process -Id $listener.OwningProcess -ErrorAction SilentlyContinue if ($proc) { Write-Host "端口 $port 被 $($proc.ProcessName) (PID $($proc.Id)) 占用,正在终止" -ForegroundColor Red Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue } } }这段代码的价值在于:它不依赖进程名判断,而是结合CommandLine字段内容(即启动命令的完整参数)做双重校验。比如node.exe进程若启动参数含main.js,基本可判定为 OpenClaw 主进程。我曾遇到一个案例,用户手动改了进程名为myapp.exe来绕过杀软,但CommandLine里仍明晃晃写着C:\Users\Alice\AppData\Roaming\npm\node_modules\openclaw\dist\main.js,这就是最可靠的指纹。
验证点:执行后,打开任务管理器 → 详细信息页,按映像名称排序,确认electron.exe、node.exe、chrome.exe是否彻底消失;再用浏览器访问http://localhost:3000,应返回This site can’t be reached。
3.2 第二步:全局 npm 包与 CLI 清理(3分钟)
这步针对 OpenClaw 的“命令入口”。很多人以为npm uninstall -g openclaw就完事,但 npm 的全局安装机制会在%APPDATA%\npm\目录下生成.cmd和.ps1代理文件,这些文件才是 CMD/PowerShell 能识别openclaw命令的真正原因。
执行以下命令:
# 1. 卸载全局 npm 包(标准流程) npm uninstall -g openclaw # 2. 手动删除残留的 CLI 代理文件(关键!) $npmDir = "$env:APPDATA\npm" Remove-Item "$npmDir\openclaw.cmd" -Force -ErrorAction SilentlyContinue Remove-Item "$npmDir\openclaw.ps1" -Force -ErrorAction SilentlyContinue Remove-Item "$npmDir\openclaw" -Force -Recurse -ErrorAction SilentlyContinue # 3. 清理 npm 缓存中的 OpenClaw 包(防止重装时秒恢复) npm cache clean --force为什么必须手动删.cmd和.ps1?因为npm uninstall -g只清理node_modules目录,而 npm 为了兼容 CMD,会把全局包的bin目录下可执行文件(如openclaw.cmd)复制到%APPDATA%\npm\。这个目录不在node_modules范围内,所以uninstall不管它。我测试过,不删这两个文件,哪怕你删光node_modules,CMD 里敲openclaw --version依然返回v1.2.3。
验证点:在新打开的 CMD 窗口中输入openclaw --version,应返回'openclaw' 不是内部或外部命令;在 PowerShell 中输入Get-Command openclaw,应返回The term 'openclaw' is not recognized。
3.3 第三步:用户数据与配置目录物理清除(2分钟)
OpenClaw 的%LOCALAPPDATA%\OpenClaw\是它的“大脑”,存放所有用户态数据。但直接rm -r会失败,因为 Electron 日志文件常被独占。必须先释放句柄再删除。
# 1. 强制释放 OpenClaw 目录下所有文件句柄(核心技巧) $openclawPath = "$env:LOCALAPPDATA\OpenClaw" if (Test-Path $openclawPath) { # 关闭所有对该目录的句柄(需管理员权限) Handle.exe -accepteula -p electron.exe -u | Select-String $openclawPath | ForEach-Object { $handleId = ($_ -split '\s+')[2] if ($handleId -match '^[0-9A-Fa-f]{8}$') { & "Handle.exe" -accepteula -p electron.exe -c $handleId -y | Out-Null } } # 安全删除目录(-Force 强制解除只读/隐藏属性) Remove-Item $openclawPath -Force -Recurse -ErrorAction SilentlyContinue Write-Host "已清除用户数据目录: $openclawPath" -ForegroundColor Green }这里用到了 Sysinternals 的Handle.exe工具(微软官方出品,安全可靠)。它能列出进程打开的所有句柄,我们用Select-String精准匹配路径,再用-c参数关闭指定句柄 ID。这是比Stop-Process更精细的操作——它不杀进程,只释放文件锁,避免进程异常退出导致数据损坏。
验证点:打开文件资源管理器,导航至%LOCALAPPDATA%,确认OpenClaw文件夹已不存在;在 PowerShell 中执行Test-Path "$env:LOCALAPPDATA\OpenClaw",应返回False。
3.4 第四步:注册表深度刮骨(8分钟)
这是最易被忽略、也最致命的一步。OpenClaw 的注册表残留集中在三个区域:启动项、文件关联、Shell 扩展。必须用 PowerShell 的Get-ChildItem -Recurse主动发现,而非凭经验猜测。
# 1. 清理启动项(HKCU Run 键) $runKeys = @( "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run", "HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce" ) foreach ($key in $runKeys) { if (Test-Path $key) { Get-ItemProperty $key | Get-Member -MemberType NoteProperty | ForEach-Object { if ($_.Name -match "OpenClaw|ocl|claw") { Remove-ItemProperty -Path $key -Name $_.Name -ErrorAction SilentlyContinue Write-Host "已删除启动项: $($_.Name) from $key" -ForegroundColor Cyan } } } } # 2. 清理 Shell 右键菜单(深度递归扫描) $shellPaths = @( "HKCU:\Software\Classes\Directory\shell", "HKCU:\Software\Classes\Directory\Background\shell", "HKCU:\Software\Classes\*\shell" ) foreach ($path in $shellPaths) { if (Test-Path $path) { Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match "OpenClaw|ocl|claw" } | ForEach-Object { Remove-Item $_.PSPath -Recurse -Force -ErrorAction SilentlyContinue Write-Host "已删除右键菜单项: $($_.PSChildName) at $($_.PSPath)" -ForegroundColor Cyan } } } # 3. 清理文件类型关联(防止 .ocl 文件双击复活) $oclExt = "HKCU:\Software\Classes\.ocl" if (Test-Path $oclExt) { Remove-Item $oclExt -Recurse -Force -ErrorAction SilentlyContinue Write-Host "已删除 .ocl 文件关联" -ForegroundColor Cyan }这段代码的威力在于Get-ChildItem -Recurse。它会像探地雷达一样扫过HKCU:\Software\Classes\Directory\shell\下所有子键,包括OpenClaw\command、OpenClaw\icon、OpenClaw\DropTarget等深层节点。CMD 的reg query只能查一级,而 PowerShell 能直达末梢。
验证点:重启电脑后,右键桌面或文件夹空白处,确认没有 “OpenClaw” 菜单项;在注册表编辑器中手动导航至HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,确认无相关键值;新建一个文本文件,重命名为test.ocl,双击应提示“选择打开方式”,而非自动启动 OpenClaw。
4. 验证清单与终极自检:如何确认真的“连根拔起”
卸载完成不等于成功,必须通过一套可量化的验证清单,逐项打钩。这套清单是我从 37 个真实用户案例中提炼出的“残留复活高发点”,漏掉任意一项,OpenClaw 都可能在 24 小时内悄然回归。
4.1 命令行层面验证(必做,2分钟)
这是最快速的初筛。打开全新的 CMD 和 PowerShell 窗口(非之前执行卸载的会话),逐项测试:
| 测试项 | 正确响应 | 错误响应(说明未清干净) | 原因定位 |
|---|---|---|---|
openclaw --version(CMD) | 'openclaw' 不是内部或外部命令 | 返回版本号如v1.2.3 | %APPDATA%\npm\openclaw.cmd未删 |
Get-Command openclaw(PowerShell) | The term 'openclaw' is not recognized | 返回ApplicationInfo对象 | %APPDATA%\npm\openclaw.ps1或node_modules仍在 |
npm list -g --depth=0 | 输出中无openclaw | 显示openclaw@1.2.3 | npm uninstall -g未执行或失败 |
where openclaw(CMD) | INFO: Could not find files for the given pattern(s) | 返回路径如C:\Users\Alice\AppData\Roaming\npm\openclaw.cmd | CLI 代理文件残留 |
提示:
where命令是 CMD 的“真相探测器”,它会扫描PATH中所有目录查找可执行文件,比which更严格。如果where openclaw有输出,说明PATH里某目录还藏着代理文件。
4.2 文件系统层面验证(必做,3分钟)
重点检查三个“黄金目录”,它们是 OpenClaw 的命脉所在:
| 目录路径 | 应状态 | 检查命令(PowerShell) | 残留后果 |
|---|---|---|---|
%APPDATA%\npm\node_modules\openclaw | 不存在 | Test-Path "$env:APPDATA\npm\node_modules\openclaw" | 全局包未卸载,npm list -g会显示它 |
%APPDATA%\npm\openclaw.* | 不存在 | Get-ChildItem "$env:APPDATA\npm\openclaw.*" -ErrorAction SilentlyContinue | CLI 命令仍可用,openclaw命令未失效 |
%LOCALAPPDATA%\OpenClaw\ | 不存在 | Test-Path "$env:LOCALAPPDATA\OpenClaw" | 用户配置、缓存、日志全在,重启即复活 |
我见过最顽固的残留案例:用户删了node_modules,但忘了%APPDATA%\npm\下的openclaw.ps1,结果每次打开 PowerShell,openclaw命令都正常响应,他以为卸载成功,直到某天发现%LOCALAPPDATA%\OpenClaw\logs\里多了 2GB 日志文件。
4.3 注册表与启动项验证(必做,5分钟)
这是“隐形杀手”藏身之处。必须用注册表编辑器(regedit)手动确认,不能只信脚本输出。
启动项检查:打开
regedit,导航至HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,右侧窗格查看所有字符串值(Value name),确认无OpenClawAutoStart、ocl_launcher、claw_boot等变体名称。注意:有些恶意变体会用OCLauncher这种缩写,务必用 Ctrl+F 全局搜索ocl、claw、open等关键词。右键菜单检查:在
regedit中依次展开HKEY_CURRENT_USER\Software\Classes\Directory\shell和HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell,观察子键列表。正常情况下,这里只有cmd、powershell、7zip等合法软件键。如果看到OpenClaw、Send to OpenClaw等键,说明第四步的注册表刮骨未到位。文件关联检查:导航至
HKEY_CURRENT_USER\Software\Classes\.ocl,如果该键存在,双击右侧(默认)值,查看其数据是否为OpenClaw.File或类似字符串。存在即代表.ocl技能文件双击会触发 OpenClaw,这是最隐蔽的复活入口。
4.4 进程与网络层面验证(终审,3分钟)
最后一步,用系统原生工具做压力测试,模拟 OpenClaw 最可能的复活场景。
进程监控:打开任务管理器 → 性能页 → 打开资源监视器(Resource Monitor),切换到“CPU”选项卡,在“关联的句柄”搜索框中输入
openclaw、ocl、claw。如果搜到任何结果,说明仍有进程在后台加载 OpenClaw 相关 DLL 或读取其配置文件。网络监听:在资源监视器的“网络”选项卡中,查看“监听端口”列表,确认
3000、3001、8080(OpenClaw 常用端口)是否为空。如果electron.exe或node.exe正在监听这些端口,说明它的 Dev Server 或 API 服务已被静默启动。计划任务检查:以管理员身份运行
taskschd.msc,在任务计划程序库中,用右上角搜索框输入openclaw、ocl。OpenClaw 有时会创建计划任务(如每天凌晨启动更新检查),这种残留 CMD 和 PowerShell 脚本都难以触及。
终极自检口诀:命令找不到、文件不存在、注册表无痕、进程不复活。四项全满足,才算真正“连根拔起”。我在客户现场做过压力测试:执行完四步法后,连续监控 72 小时,用 Process Explorer 实时抓取所有新创建进程的父进程链,确认无任何 OpenClaw 相关模块加载。这才是交付标准。
5. 预防复发:给你的系统装上“免疫补丁”
卸载只是止损,预防才是长久之计。OpenClaw 类工具的安装逻辑高度相似,掌握以下三招,未来同类工具将再难扎根。
5.1 npm 全局安装的“沙盒化”实践(一劳永逸)
根本矛盾在于:npm install -g把包装进%APPDATA%\npm\,而该目录默认在PATH中,导致全局污染。解决方案是重定向 npm 全局目录到隔离区,并显式管理PATH。
执行以下命令(需管理员 PowerShell):
# 1. 创建隔离的全局目录(不在用户主目录下,避免被误删) $globalNpmPath = "C:\Tools\npm-global" New-Item -ItemType Directory -Path $globalNpmPath -Force | Out-Null # 2. 配置 npm 使用新目录 npm config set prefix "$globalNpmPath" # 3. 将新目录加入 PATH(仅当前用户,安全可控) $currentPath = [Environment]::GetEnvironmentVariable("Path", "User") if ($currentPath -notmatch [regex]::Escape($globalNpmPath)) { $newPath = "$currentPath;$globalNpmPath" [Environment]::SetEnvironmentVariable("Path", $newPath, "User") } # 4. 验证(重启 PowerShell 后执行) npm config get prefix # 应返回 C:\Tools\npm-global从此,所有npm install -g的包都装进C:\Tools\npm-global\,与%APPDATA%\npm\彻底解耦。卸载时只需删C:\Tools\npm-global\node_modules\openclaw,再从PATH中移除C:\Tools\npm-global即可,零残留。
5.2 PowerShell 执行策略的“最小权限”配置(安全基石)
ExecutionPolicy不是障碍,而是安全护栏。永久设为Unrestricted等于拆掉防火墙,而RemoteSigned是最佳平衡点。
# 为当前用户设置 RemoteSigned(推荐) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force # 查看当前策略(确认生效) Get-ExecutionPolicy -ListRemoteSigned的含义是:本地脚本(如你写的cleanup-openclaw.ps1)无需签名即可运行,而从互联网下载的脚本(如 GitHub 上的.ps1)必须有有效数字签名。这既保障了你的运维自由,又堵死了恶意脚本注入漏洞。我所有客户的生产环境都采用此策略,零安全事故。
5.3 建立“卸载快照”习惯(主动防御)
每次安装新工具前,用 PowerShell 记录系统状态,为未来卸载提供基线对比。
# 安装前执行(保存为 before-install.csv) Get-ChildItem "$env:APPDATA\npm\node_modules" | Select-Object Name, LastWriteTime | Export-Csv "C:\backup\before-openclaw.csv" -NoTypeInformation # 安装后执行(保存为 after-install.csv) Get-ChildItem "$env:APPDATA\npm\node_modules" | Select-Object Name, LastWriteTime | Export-Csv "C:\backup\after-openclaw.csv" -NoTypeInformation # 卸载时对比(找出新增项,即 OpenClaw 及其依赖) $before = Import-Csv "C:\backup\before-openclaw.csv" $after = Import-Csv "C:\backup\after-openclaw.csv" Compare-Object $before $after -Property Name | Where-Object {$_.SideIndicator -eq "=>"} | ForEach-Object { Write-Host "新增包: $($_.Name)" -ForegroundColor Green # 自动执行卸载 npm uninstall -g $_.Name }这套快照机制,让我在帮客户处理motorolardpconnection等混淆词问题时,3 分钟内就定位到真正的罪魁祸首——一个叫rdp-proxy-cli的 npm 包,而非 Motorola 官方软件。它不靠猜测,靠证据链。
我在实际操作中发现,90% 的“卸载不干净”问题,根源不是技术难度,而是缺乏系统性思维。人们总想找个一键卸载工具,却不愿花 10 分钟理解 OpenClaw 的安装逻辑。当你把npm、PowerShell、注册表视为同一套系统的不同接口,而非割裂的工具,卸载就从玄学变成了可推演的工程。最后再分享一个小技巧:把本文的四步法保存为cleanup-openclaw.ps1,放在C:\Tools\下,以后遇到类似工具(如claude-code、ollama-ui),只需替换脚本中的关键词,就能复用整套逻辑——这才是真正的“连根拔起”能力。