NSIS:创建的环境变量不起作用

时间:2012-02-15 11:10:25

标签: nsis

我正在创建一个Env变量,然后将它附加到Win7 - 64位上的NSIS安装程序脚本中的PATH变量中。

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。 如果我以管理员身份运行cmd提示符然后运行exe,则运行正常。 如果我直接以管理员身份运行exe,它也可以工作。

同样有趣的是,如果我打开环境编辑器,双击MyPath变量并单击OK(不更改任何内容),我的exe运行正常,无需以管理员身份运行。 现在如果我在cmd提示符中检查Path,则MyPath变量被替换为

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

我在创建env变量后尝试添加“调用EnvVarUpdate”,但它不起作用。

我正在使用NSIS Unicode版本2.46.3

2 个答案:

答案 0 :(得分:0)

使用注册表,通过截断路径添加/修改路径而不会丢失数据的可能性会大得多。

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

如果您的系统有AUTOEXEC.BAT文件,则AUTOEXEC.BAT中的任何PATH设置也将附加到%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将反映新值。

答案 1 :(得分:-2)

 ${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