nsis - 如何在 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 工具确认这一点。同一页面还提供了一个您可以尝试的 MoveFile 工具。
假设操作已被记录,您应该调查文件操作在引导过程中可能失败的原因:
- 一个或两个文件都是只读的。
- 安全描述符 (ACL) 阻止移动和/或删除操作。
- 您尝试替换的文件是受保护的系统文件。
- 文件被系统或驱动程序锁定。
根据这个答案,进程监视器启动日志在重命名操作开始之前处于活动状态,因此您可以使用它来查看它是否提供有关操作失败原因的任何线索......
推荐阅读
- kotlin-multiplatform - SQLDelight - java.lang.UnsatisfiedLinkError:找不到“libsqlitejdbc.so”
- kubernetes - 同一节点中同一 pod 的多个实例 - Kubernetes
- reactjs - react中的axios在本地工作,但在heroku中不起作用
- spring-boot - 将springboot war文件上传到Weblogic 12.2.1.3服务器时出错
- python - 为什么这个 Python 文件(解析 XML 和验证)可以在 Windows 上工作,但不能在 Mac OS 上工作?
- r - 将开始和结束范围中的重叠分离到自己的数据框行中
- amazon-web-services - AWS Sagemaker Studio 本地 RAM 过载
- javascript - return 语句后的括号
- fortran - Fo Householder Transformation QR 分解的标志问题
- c++ - left, right, setw 一起输出问题