当您执行以下操作时,我发现 $ TEMP 参数的值不同:
手动运行将导致$ 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 ?
是否有更好的解决方案来解决通过重新启动系统进行安装的情况?
答案 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
来告知其路径。