1

当您执行以下操作时,我注意到$TEMP参数具有不同的值:

  • 手动运行installer.exe(双击)
  • 从具有管理员权限的应用程序运行。

手动运行将导致 $TEMP = C:/Users/username/AppData/Local/Temp

从具有管理员权限的应用程序运行 = C:/Windows/Temp

健康)状况:

我有一个安装程序,需要重新启动系统才能完成该过程。

为此,我在 $TEMP 中制作了安装程序的副本,并将路径放入RunOnce

问题:

该功能工作正常(重新启动后,程序更新为新版本)。

但是,在安装过程结束时,我无法删除安装程序的副本,因为 $TEMP = C:/Users/username/AppData/Local/Temp在通过RunOnce运行安装程序时。

实际上,安装程序的副本位于C:/Windows/Temp

问题:

是否可以强制 $TEMP 始终为 = C:/Windows/Temp

有没有更好的解决方案来解决系统重新启动安装的情况?

4

1 回答 1

4

NSIS 得到它的$Temp变量是这样的:

首先它尝试GetTempPath。该函数尝试(按顺序):%TMP%%TEMP%%USERPROFILE%%WINDIR%,并返回第一个存在的变量。

NSIS 然后尝试写入该目录,如果失败,NSIS 使用%WINDIR%\Temp.

管理员与非管理员或 UAC 提升并不是您所看到的真正原因。听起来更像是配置或防病毒问题。

$Temp如果你真的想在 NSIS 3中强制到一个特定的目录:

Function .onInit
UnsafeStrCpy $Temp "$Windir\Temp"
CreateDirectory $Temp
/* 
#--# Uncomment to apply the same %TEMP% to child processes #--#
System::Call 'KERNEL32::SetEnvironmentVariable(t"TEMP",t"$Temp")'
System::Call 'KERNEL32::SetEnvironmentVariable(t"TMP",t"$Temp")'
*/
FunctionEnd

不过,我实际上并不理解您的问题,因为 RunOnce 条目可以通过使用$ExePath.

于 2018-11-26T21:54:27.847 回答