【笔记】AutoClaw NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的

title: "NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的"

date: 2026-07-19
tags: Windows, NSIS, 安装, 故障排查, AutoClaw
status: draft

Z.ai - Inspiring AGI to Benefit Humanity

AutoClaw NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的

AutoClaw 从 1.12.1 升级到 1.13.0,正常操作,结果安装向导卡在"正在卸载旧版本"一动不动。更要命的是,这不是偶发问题 ------从它出的第一、二版开始,每次升级都会卡在这个地方,一卡就卡很长时间(几个小时以上)。1.13.0 这次尤其狠,昨晚开始升级,今天中午还在卡着,挂了将近 17 个小时,期间有弹窗显示进程未结束导致安装受阻,一查进程发现似乎是安装程序"自己卡自己",这就十分离谱。

我花了大半天把它搞定了,记录一下,给遇到同样问题的朋友一个参考。


问题长什么样

运行 autoclaw-1.13.0-setup-cn.exe,进度条走到一半就不动了,提示大概是"正在停止 AutoClaw 后台进程",然后就死在那儿。

任务管理器里能看见:

  • PID 31284:autoclaw-1.13.0-setup-cn(跑了 17 个小时,CPU 0%)
  • PID 143256:同一个程序(我后来又双击了一次)

用 PowerShell 查进程,常规方法全部失效:

复制代码
Stop-Process -Id 31284 -Force   # 失败
taskkill /F /PID 31284           # 失败

甚至 WMI 查询 Get-CimInstance Win32_Process 都卡住,连带把我自己的 PowerShell 也被外层 SIGKILL 了。

更离谱的是,D:\Programs\AutoClaw 目录删不掉,cmd /c rd /s /q 报"文件被另一个进程使用",Remove-Item -Recurse 被系统安全策略拦了两次确认。


诊断过程

第一反应是进程僵死了(Zombie Process)。查了一下:

  • PID 31284 的 HandleCount = 0,CPU = 0
  • 但 OpenProcess(PROCESS_TERMINATE, ...) 居然能成功打开句柄

这说明:进程在内核态已经 exit,但 Windows 的 EPROCESS 结构还残留在进程表里,ObjDir 里还有引用,所以系统调用它就 hang。

换句话说,NSIS 安装器调用 TerminateProcess(31284) 时,永远等在内核态。


解法:绕过安装器,自己动手装

既然安装器本身动不了,那就把它要干的活拆开自己做。

第一步:用 NtTerminateProcess 强行终结

.NET 的 Process.Kill() 和 PowerShell 的 Stop-Process 都走的是同一个内核路径(NtTerminateProcess),但会被卡住的调用方传染。用 C# 直接 P/Invoke 调用 ntdll:

复制代码
// C#
[DllImport("ntdll.dll")]
public static extern int NtTerminateProcess(IntPtr h, uint exitCode);

// 调用
IntPtr h = OpenProcess(PROCESS_TERMINATE, false, 31284);
NtTerminateProcess(h, 0);  // 返回 0xC0000008 但进程实际已死

执行后 PID 31284 真的没了。

第二步:改名解锁目录

D:\Programs\AutoClaw 被旧进程锁着删不掉。用 System.IO.Directory.Move() 改名(不走文件句柄路径,所以不触发锁检查):

复制代码
[System.IO.Directory]::Move("D:\Programs\AutoClaw", "D:\Programs\AutoClaw-old-LOCKED")

改名成功后,目录立即解锁,原路径 D:\Programs\AutoClaw 变成了一个可以正常使用的新空目录。

第三步:7z 暴力解压安装包

NSIS 安装包本质是个自解压 SFX。用 7-Zip 直接拆:

复制代码
# 1. 解压外层 NSIS 结构
7z x autoclaw-1.13.0-setup-cn.exe -oD:\AutoClaw-1.13.0
# 结果:$PLUGINSDIR\app-64.7z(312MB)

# 2. 解压真正的应用包
7z x "D:\AutoClaw-1.13.0\$PLUGINSDIR\app-64.7z" -oD:\AutoClaw-1.13.0\app-extract
# 结果:AutoClaw.exe (180MB) + resources + locales,共 6038 个文件,1.48 GB

第四步:xcopy 装进去

复制代码
xcopy /E /Y D:\AutoClaw-1.13.0\app-extract\* D:\Programs\AutoClaw\
# 6038 File(s) copied

第五步:注册表 + 快捷方式

注册表卸载项写用户级(HKCU,不需要管理员权限):

复制代码
$guid = "{" + [guid]::NewGuid().ToString().ToUpper() + "}"
$regPath = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$guid"
New-Item -Path $regPath -Force | Out-Null
Set-ItemProperty -Path $regPath -Name "DisplayName"      -Value "AutoClaw"
Set-ItemProperty -Path $regPath -Name "DisplayVersion"   -Value "1.13.0"
Set-ItemProperty -Path $regPath -Name "Publisher"        -Value "ZhipuAI"
Set-ItemProperty -Path $regPath -Name "InstallLocation"  -Value "D:\Programs\AutoClaw"

快捷方式用 WScript.Shell 创建:

复制代码
$WshShell = New-Object -ComObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$env:USERPROFILE\Desktop\AutoClaw.lnk")
$Shortcut.TargetPath = "D:\Programs\AutoClaw\AutoClaw.exe"
$Shortcut.WorkingDirectory = "D:\Programs\AutoClaw"
$Shortcut.Description = "AutoClaw - 智谱 AI 桌面助手"
$Shortcut.Save()

第六步:启动

复制代码
Start-Process D:\Programs\AutoClaw\AutoClaw.exe

瞬间 4 个进程全跑起来,FileVersion: 1.13.0.431,安装完成 ✅


总结

说起来复杂,实际上核心就三板斧:

  1. NtTerminateProcess 绕过卡住的系统调用
  2. 改名而不是删除,绕过文件锁
  3. 7z 解压替代安装器,自己做文件复制

整个过程大概 10 分钟(解压比较慢,要 1-2 分钟),比等 NSIS 安装器"回过神"快多了。

如果你也遇到类似的问题(升级安装卡死、杀进程杀不掉),不妨试试这个思路------把安装器的黑盒操作拆开,自己用命令行拼出来。

另外,如果你是 AutoClaw 开发者,这个问题其实有更优雅的解法:升级前先主动退出旧进程,或者在 NSIS 里加个超时机制,别让 installer 傻等。另外可以考虑给用户留个"强制重装"的入口,不用非得先跑卸载程序。


有问题欢迎评论区交流。

相关推荐
java资料站9 小时前
二、Spring AI Alibaba · ChatModel
java·windows·spring
博图光电9 小时前
Libra 27105相关技术参数
人工智能·数码相机
Titan20249 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
IT_陈寒9 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
yumgpkpm9 小时前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
程序员cxuan9 小时前
腾讯又来一王炸,开源版 WorkBuddy 太夯了!
人工智能·后端·程序员
邓工说电10 小时前
智慧断路器安全吗?数据加密、离线保护与合规认证全解读
大数据·数据库·人工智能·智能断路器·炜晔科技
阿里云大数据AI技术10 小时前
Lance 数据检索怎么选,当然阿里云 Milvus 向量湖
人工智能
出海客10 小时前
跨境电商多语言客服知识库怎么建:资料结构、检索边界与人工升级
大数据·人工智能
北冥you鱼10 小时前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang