NSIS: созданная переменная окружения не работает - PullRequest
1 голос
/ 15 февраля 2012

Я создаю переменную Env и затем добавляю ее к переменной PATH в моем сценарии установки NSIS на Win7 - 64-разрядная версия.

Push "MyPath"
Push "D:\MyFolder\bin;D:\MyFolder\lib"
Call WriteEnvStr

Push "%MyPath%"
Call AddToPath

Теперь после установки я вижу обе переменные в приглашении cmd

MyPath=D:\MyFolder\bin;D:\MyFolder\lib
Path=%MyPath%;<my existsing path>

Но любые exe / dll из не найдены во время выполнения. Если я запускаю командную строку с правами администратора, а затем запускаю exe, она работает нормально. Это также работает, если я запускаю exe напрямую от имени администратора.

Также интересно то, что если я открою редактор среды, дважды щелкните переменную MyPath и нажму OK (без каких-либо изменений), мой exe-файл будет работать нормально, не работая от имени администратора. И теперь, если я проверяю Path в командной строке cmd, переменная MyPath подставляется

MyPath=D:\MyFolder\bin;D:\MyFolder\lib
Path=D:\MyFolder\bin;D:\MyFolder\lib;<my existsing path>

Я пытался добавить «Call EnvVarUpdate» после создания переменной env, но она не работает.

Я использую NSIS Unicode версии 2.46.3

Ответы [ 2 ]

0 голосов
/ 06 июня 2017

Ваши шансы на добавление / изменение пути без потери данных в пути путем его усечения были бы намного выше при использовании реестра.

ReadRegStr $0 HKCU "Environment" Path
StrCpy $1 "D:\MyFolder\bin;D:\MyFolder\lib"
StrCpy $2 "$0;$1"
WriteRegStr HKCU "Environment" Path "$2"

Если в вашей системе есть файл AUTOEXEC.BAT, то любой параметр PATH в AUTOEXEC.BAT также будет добавлен к переменной среды% PATH%. Это сделано для обеспечения совместимости со старыми процедурами установки, которым необходимо установить PATH. Однако все остальные команды в AUTOEXEC.BAT игнорируются. И в любом случае это более или менее устарело.

Но мы могли бы просто продолжить ваш метод, однако просто попробуйте другие способы достижения вашей цели. Я не проверял это, но вы можете попробовать что-то похожее на это:

StrCpy $R0 "MYPATH"
StrCpy $R1 "D:\MyFolder\bin;D:\MyFolder\lib"
System::Call `Kernel32::SetEnvironmentVariable(t"$R0",t"$R1")`

Теперь включите вашу новую переменную в путь, как показано ниже:

ReadEnvStr $R0 COMSPEC
ReadEnvStr $R1 MYPATH
ExecDos::Exec /TOSTACK `"$R0" /c "SetX PATH=%PATH%;$R1 -m"`

Теперь вы можете легко изменить эту переменную% MYPATH% в любое время в будущем, и PATH будет отражать новое значение.

0 голосов
/ 11 декабря 2014
 ${EnvVarUpdate} $0 "PATH" "A" "HKLM" "C:\Program Files\Java\jre6\bin"

 StrCpy $R0 "$0"

 System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r2'

 ReadEnvStr $R0 "PATH"

 ExecWait "$INSTDIR\tmp\batchfile.bat
...