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

NSIS:创建的环境变量不起作用,nsis,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

我正在创建一个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变量后添加Call EnvVarUpdate,但它不起作用


我使用的是NSIS Unicode 2.46.3版

通过使用注册表,添加/修改路径而不丢失路径中的数据的几率会大得多

 ${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
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%环境变量中。这是为了提供与需要设置路径的旧安装例程的兼容性。但是,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%,该路径将反映新的值。

我在SuperUser中看到的答案表明,这不是NSIS问题,而是Windows环境问题。另一个环境中的变量。变量不知道这有多真实。