Setting Environment Variables: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
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>!include WinMessages.nsh
<highlight-nsis>!ifndef _WriteEnvStr_nsh
!define _WriteEnvStr_nsh


!ifdef ALL_USERS
!include WinMessages.nsh
  !define WriteEnvStr_RegKey \
 
    'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
!ifndef WriteEnvStr_RegKey
!else
  !ifdef ALL_USERS
  !define WriteEnvStr_RegKey 'HKCU "Environment"'
    !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