首页 > 解决方案 > 如何在 nsis 中重新启动时移动文件

问题描述

我需要在重新启动时将文件从源移动到目标。尝试了以下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`

标签: nsisreboot

解决方案


我们在其他地方确认您对 MoveFileEx 的直接调用成功。这应该意味着注册表中已经记录了重命名操作。您可以使用 SysInternals 的PendMoves 工具确认这一点。同一页面还提供了一个您可以尝试的 MoveFile 工具。

假设操作已被记录,您应该调查文件操作在引导过程中可能失败的原因:

  • 一个或两个文件都是只读的。
  • 安全描述符 (ACL) 阻止移动和/或删除操作。
  • 您尝试替换的文件是受保护的系统文件
  • 文件被系统或驱动程序锁定。

根据这个答案,进程监视器启动日志在重命名操作开始之前处于活动状态,因此您可以使用它来查看它是否提供有关操作失败原因的任何线索......


推荐阅读