NSIS $ TEMP имеет различную ценность - PullRequest
0 голосов
/ 22 ноября 2018

Меня заметили $ TEMP Параметр имеет другое значение, когда вы:

  • запускаете installer.exe вручную (двойным щелчком мыши)
  • запускать изПриложение с правами администратора.

Запуск вручную приведет к $ TEMP = C: / Users / имя пользователя / AppData / Local / Temp

Запуск из приложения с Adminправа = C: / Windows / Temp

СОСТОЯНИЕ:

У меня есть установщик, который требует перезагрузка системы для завершенияпроцесс.

Для этого я делаю копию установщика в $ TEMP и помещаю путь в RunOnce

ПРОБЛЕМА:

Функция работает нормально (после перезагрузки программа обновляется до новой версии).

Однако в конце процесса установки я не могу удалить копию программы установки, так как $TEMP = C: / Users / имя пользователя / AppData / Local / Temp при запуске установщика с помощью RunOnce .

Фактически, копy установщика находится в C: / Windows / Temp

ВОПРОС:

Можно ли заставить $ TEMP всегда быть = C: / Windows / Temp ?

Есть ли лучшее решение, чтобы обойти проблему установки с перезагрузкой системы?

1 Ответ

0 голосов
/ 27 ноября 2018

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.

...