问题描述
我需要在重新启动时将文件从源移动到目标。尝试了以下3种方法,都失败了
IfFileExists "$Temp\test.dll" 0 new_installation
Strcpy $ALREADY_INSTALLED 1
new_installation:
Setoverwrite on
!insertmacro InstallLib DLL $ALREADY_INSTALLED REBOOT_PROTECTED "$Temp\test.dll" "$WINDIR\test.dll" "$WINDIR"
System::Call "kernel32::MoveFileEx(t '$TEMP\test.dll',t '$WINDIR\test.dll',i 5)"
Rename /REBOOTOK '$TEMP\test.dll' `$WINDIR\test.dll`
解决方法
我们在别处确认您直接调用 MoveFileEx 成功。这应该意味着重命名操作已记录在注册表中。您可以使用来自 SysInternals 的 PendMoves tool 确认这一点。同一页面还提供了一个 MoveFile 工具,您可以试试。
假设操作已被记录,您应该调查文件操作在启动过程中可能失败的原因:
- 一个或两个文件都是只读的。
- 安全描述符 (ACL) 阻止移动和/或删除操作。
- 您尝试替换的文件是 protected system file。
- 文件被系统或驱动程序锁定。
根据 this answer,进程监视器启动日志记录在重命名操作开始之前处于活动状态,因此您可以使用它来查看它是否提供了有关操作失败原因的任何线索...