我正在创建一个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
答案 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