Setting Environment Variables: Difference between revisions
m (Adding new author and category links.) |
|||
Line 32: | Line 32: | ||
'''Note:''' under Windows 9x a reboot is required for changes to take affect. The reboot flag will be set by these functions if a reboot is required. | '''Note:''' under Windows 9x a reboot is required for changes to take affect. The reboot flag will be set by these functions if a reboot is required. | ||
'''Warning:''' this script will only work on NSIS 2.0b2 and above! | '''Warning:''' this script will only work on NSIS 2.0b2 and above! | ||
<highlight-nsis>! | <highlight-nsis>!ifndef _WriteEnvStr_nsh | ||
!define _WriteEnvStr_nsh | |||
!ifdef ALL_USERS | !include WinMessages.nsh | ||
!ifndef WriteEnvStr_RegKey | |||
!else | !ifdef ALL_USERS | ||
!define WriteEnvStr_RegKey \ | |||
'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' | |||
!else | |||
!define WriteEnvStr_RegKey 'HKCU "Environment"' | |||
!endif | |||
!endif | !endif | ||
Line 55: | Line 60: | ||
Exch $0 ; $0 has environment variable name | Exch $0 ; $0 has environment variable name | ||
Push $2 | Push $2 | ||
Call IsNT | Call IsNT | ||
Pop $2 | Pop $2 | ||
Line 72: | Line 77: | ||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ | SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ | ||
0 "STR:Environment" /TIMEOUT=5000 | 0 "STR:Environment" /TIMEOUT=5000 | ||
WriteEnvStr_done: | WriteEnvStr_done: | ||
Pop $2 | Pop $2 | ||
Line 94: | Line 99: | ||
Push $4 | Push $4 | ||
Push $5 | Push $5 | ||
Call un.IsNT | Call un.IsNT | ||
Pop $1 | Pop $1 | ||
Line 105: | Line 110: | ||
StrCpy $0 "SET $0=" | StrCpy $0 "SET $0=" | ||
SetRebootFlag true | SetRebootFlag true | ||
DeleteEnvStr_dosLoop: | DeleteEnvStr_dosLoop: | ||
FileRead $1 $3 | FileRead $1 $3 | ||
Line 114: | Line 119: | ||
FileWrite $2 $3 | FileWrite $2 $3 | ||
Goto DeleteEnvStr_dosLoop | Goto DeleteEnvStr_dosLoop | ||
DeleteEnvStr_dosLoopEnd: | DeleteEnvStr_dosLoopEnd: | ||
FileClose $2 | FileClose $2 | ||
Line 128: | Line 133: | ||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ | SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ | ||
0 "STR:Environment" /TIMEOUT=5000 | 0 "STR:Environment" /TIMEOUT=5000 | ||
DeleteEnvStr_done: | DeleteEnvStr_done: | ||
Pop $5 | Pop $5 | ||
Line 137: | Line 142: | ||
Pop $0 | Pop $0 | ||
FunctionEnd | FunctionEnd | ||
!ifndef IsNT_KiCHiK | |||
!define IsNT_KiCHiK | |||
# | # | ||
Line 167: | Line 175: | ||
!macroend | !macroend | ||
!insertmacro IsNT "" | !insertmacro IsNT "" | ||
!insertmacro IsNT "un."</highlight-nsis> | !insertmacro IsNT "un." | ||
!endif ; IsNT_KiCHiK | |||
!endif ; _WriteEnvStr_nsh | |||
</highlight-nsis> | |||
[[Category:Disk, Path & File Functions]] | [[Category:Disk, Path & File Functions]] |
Revision as of 00:17, 30 July 2005
Author: KiCHiK (talk, contrib) |
How To Use
If you want to change the path environment variable see: Path Manipulation. If you want to set an environment variable only for the installer process and its sub-processes use:
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("name", "value").r0' StrCmp $0 0 error ExecWait ProgThatReadsEnv.exe Goto done error: MessageBox MB_OK "Can't set environment variable" done:
If you want to set an environment variable that will stick for every other process and after reboots too you should use the functions below. To use them either save them as a .NSH file and include them in your script, or just copy paste them in your script. If you choose to save them as a .NSH file use:
!include WriteEnvStr.nsh # or the name you chose # ... Section "Add Env Var" Push MyEnvVar Push MyEnvVarValue Call WriteEnvStr SectionEnd # ... Section uninstall # remove the variable Push MyEnvVar Call un.DeleteEnvStr SectionEnd
If you want the environment variable to be avaiable to all of the users using the computer define ALL_USERS before you include WriteEnvStr.nsh (or before the part of the script holding these functions if you didn't save it as a .NSH file). For example:
!define ALL_USERS !include WriteEnvStr.nsh # or the name you chose
The Functions
Note: under Windows 9x a reboot is required for changes to take affect. The reboot flag will be set by these functions if a reboot is required. Warning: this script will only work on NSIS 2.0b2 and above!
!ifndef _WriteEnvStr_nsh !define _WriteEnvStr_nsh !include WinMessages.nsh !ifndef WriteEnvStr_RegKey !ifdef ALL_USERS !define WriteEnvStr_RegKey \ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' !else !define WriteEnvStr_RegKey 'HKCU "Environment"' !endif !endif # # WriteEnvStr - Writes an environment variable # Note: Win9x systems requires reboot # # Example: # Push "HOMEDIR" # name # Push "C:\New Home Dir\" # value # Call WriteEnvStr # Function WriteEnvStr Exch $1 ; $1 has environment variable value Exch Exch $0 ; $0 has environment variable name Push $2 Call IsNT Pop $2 StrCmp $2 1 WriteEnvStr_NT ; Not on NT StrCpy $2 $WINDIR 2 ; Copy drive of windows (c:) FileOpen $2 "$2\autoexec.bat" a FileSeek $2 0 END FileWrite $2 "$\r$\nSET $0=$1$\r$\n" FileClose $2 SetRebootFlag true Goto WriteEnvStr_done WriteEnvStr_NT: WriteRegExpandStr ${WriteEnvStr_RegKey} $0 $1 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ 0 "STR:Environment" /TIMEOUT=5000 WriteEnvStr_done: Pop $2 Pop $0 Pop $1 FunctionEnd # # un.DeleteEnvStr - Removes an environment variable # Note: Win9x systems requires reboot # # Example: # Push "HOMEDIR" # name # Call un.DeleteEnvStr # Function un.DeleteEnvStr Exch $0 ; $0 now has the name of the variable Push $1 Push $2 Push $3 Push $4 Push $5 Call un.IsNT Pop $1 StrCmp $1 1 DeleteEnvStr_NT ; Not on NT StrCpy $1 $WINDIR 2 FileOpen $1 "$1\autoexec.bat" r GetTempFileName $4 FileOpen $2 $4 w StrCpy $0 "SET $0=" SetRebootFlag true DeleteEnvStr_dosLoop: FileRead $1 $3 StrLen $5 $0 StrCpy $5 $3 $5 StrCmp $5 $0 DeleteEnvStr_dosLoop StrCmp $5 "" DeleteEnvStr_dosLoopEnd FileWrite $2 $3 Goto DeleteEnvStr_dosLoop DeleteEnvStr_dosLoopEnd: FileClose $2 FileClose $1 StrCpy $1 $WINDIR 2 Delete "$1\autoexec.bat" CopyFiles /SILENT $4 "$1\autoexec.bat" Delete $4 Goto DeleteEnvStr_done DeleteEnvStr_NT: DeleteRegValue ${WriteEnvStr_RegKey} $0 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \ 0 "STR:Environment" /TIMEOUT=5000 DeleteEnvStr_done: Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 FunctionEnd !ifndef IsNT_KiCHiK !define IsNT_KiCHiK # # [un.]IsNT - Pushes 1 if running on NT, 0 if not # # Example: # Call IsNT # Pop $0 # StrCmp $0 1 +3 # MessageBox MB_OK "Not running on NT!" # Goto +2 # MessageBox MB_OK "Running on NT!" # !macro IsNT UN Function ${UN}IsNT Push $0 ReadRegStr $0 HKLM \ "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion StrCmp $0 "" 0 IsNT_yes ; we are not NT. Pop $0 Push 0 Return IsNT_yes: ; NT!!! Pop $0 Push 1 FunctionEnd !macroend !insertmacro IsNT "" !insertmacro IsNT "un." !endif ; IsNT_KiCHiK !endif ; _WriteEnvStr_nsh