如何在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`

解决方法

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...