title: "NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的"
date: 2026-07-19
tags: Windows, NSIS, 安装, 故障排查, AutoClaw
status: draft
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,安装完成 ✅

总结
说起来复杂,实际上核心就三板斧:
- NtTerminateProcess 绕过卡住的系统调用
- 改名而不是删除,绕过文件锁
- 7z 解压替代安装器,自己做文件复制
整个过程大概 10 分钟(解压比较慢,要 1-2 分钟),比等 NSIS 安装器"回过神"快多了。
如果你也遇到类似的问题(升级安装卡死、杀进程杀不掉),不妨试试这个思路------把安装器的黑盒操作拆开,自己用命令行拼出来。
另外,如果你是 AutoClaw 开发者,这个问题其实有更优雅的解法:升级前先主动退出旧进程,或者在 NSIS 里加个超时机制,别让 installer 傻等。另外可以考虑给用户留个"强制重装"的入口,不用非得先跑卸载程序。

有问题欢迎评论区交流。