“下次启动时删除”的原理
Windows 下删除文件、尤其卸载程序时,有时会提示“下次启动时删除”,这是Windows底层提供的一个功能,具体来说是,把要删除的文件路径写到注册表里一个特定位置,下次Windows启动时,会自动检测这个位置里写的文件路径,删除它们。
这个位置在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
下的 PendingFileRenameOperations
,是一个长文本数据,如果已经写入了待删除文件列表,大致如下
\??\C:\Users\feng\AppData\Local\Temp\Au_.exe \??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp\Un_A.exe \??\C:\Users\feng\AppData\Local\Temp\~nsuA.tmp
更具体的说,这个注册表项是由win32 api 函数 moveFileExW 函数 (winbase.h) 写入的,该函数调用时第三个参数指定了 MOVEFILE_DELAY_UNTIL_REBOOT 标志。详见moveFileExW函数的官方文档
应用案例
基于以上原理,
场景:
卸载某个程序后提示某个文件要重启后删除,但又不想重启系统;同时,已经找到了相关文件由哪个进程占用,结束掉进程,并且手工删掉了相关文件。
如果还想重新安装该程序,安装向导很可能会提示,需要重启系统才能继续。
但又实在不想重启系统,或因各种原因不能马上重启。
则:
这时,只要到上述注册表项里,把相关行删掉,再运行安装程序,就可以继续了。
也可以把其中所有行里的待删除文件都手工删除掉,再清空该注册表项。
附记
查找某个文件被哪个进程占用,可以使用 SysinternalsSuite 工具包里的 handle.exe ,不带任何参数运行,即是当前所有进程打开的handle句柄,可以管理员身份运行 handle.exe | findstr xyz 查看是否有相关匹配项,其中xyz是文件名。如果有结果,则 handle.exe > dump.txt 然后到dump.txt 里找相关进程信息。这样的好处是不用理会 handle.exe 的参数,简单粗暴;即使其参数用法似乎并不复杂。
Last Updated on 2025/02/05