NSIS $ TEMP具有不同的值

时间:2018-11-22 02:03:18

标签: windows installation nsis temp runonce

当您执行以下操作时,我发现 $ 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

是否有更好的解决方案来解决通过重新启动系统进行安装的情况?

1 个答案:

答案 0 :(得分:1)

NSIS的$Temp变量如下所示:

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

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

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

如果您确实想在NSIS 3中使用,可以将$Temp强制到特定目录。

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来告知其路径。