好的,我有一個我的nsi腳本的簡化版本(見下文)。在A2部分中,我將單個可執行文件複製到指定的安裝路徑,創建環境變量,然後執行一個SendMessage,它應該讓所有當前正在運行的進程知道env的變化。然而,似乎NSIS安裝過程本身沒有更新,因爲我在鏈接部分創建快捷方式不起作用帶有環境變量的NSIS CreateShortcut
installer.nsi:
SetCompressor /FINAL zlib
!include LogicLib.nsh
!include WinMessages.nsh
!include x64.nsh
!define ENGINE "TEST"
!define DERIV "A2"
!define LIB_VER "v43"
!define RELEASE "v3dev2"
Name "${ENGINE}${DERIV} DTE ${RELEASE}"
OutFile "${ENGINE}${DERIV}-DTE.exe"
; display the installation directory page
; note that NSIS places the selected directory in $INSTDIR
; DirText ""
Page directory setDefaultInstallDirectory
Function setDefaultInstallDirectory
;check for an existing sim root and set it as
the default installation directory if it exists
ReadEnvStr $1 SIM_ROOT
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
FunctionEnd
; display the installation page and show a message
; when the installation is complete
Page instfiles "" "" finished
Function finished
MessageBox MB_OK "Installation Complete."
FunctionEnd
section "A2"
SetOutPath $INSTDIR\${ENGINE}\${DERIV}
File alt_control.exe
; Environment Variables
WriteRegStr HKCU "Environment" "SIM_ROOT" "$INSTDIR"
WriteRegStr HKCU "Environment" "ENGINE" "${ENGINE}"
WriteRegStr HKCU "Environment" "DERIV" "${DERIV}"
WriteRegExpandStr HKCU "Environment" "RUN_DIR" "%SIM_ROOT%\%ENGINE%\%DERIV%"
; Broadcast to all processes that they need to update their environment
; http://forums.winamp.com/showthread.php?t=118501
SendMessage ${HWND_BROADCAST}
${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
sectionEnd
section "Links"
; create the start menu directory & shortcuts
CreateDirectory $SMPROGRAMS\DTE
SetOutPath "$INSTDIR"
CreateShortCut "$SMPROGRAMS\DTE\AltControl.lnk"
"$INSTDIR\%ENGINE%\%DERIV%\alt_control.exe"
; Broadcast to all processes that they need to update their environment
; http://forums.winamp.com/showthread.php?t=118501
SendMessage ${HWND_BROADCAST}
${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
sectionEnd
運行安裝程序後,再嘗試運行開始菜單快捷方式AltControl.lnk,您會看到Windows缺少快捷方式錯誤。特別是:「Windows正在搜索alt_control.exe。要自己查找文件,請單擊瀏覽。」
如果執行安裝時環境變量已經存在,那麼鏈接將起作用。即使是更奇怪的,如果你點擊開始菜單的快捷方式屬性,並做一些微不足道的變化(如添加和刪除註釋字段中的空格),然後單擊應用,Windows似乎重新生成AltControl.lnk文件(我知道因爲.lnk文件即使沒有通過對話框進行功能改變,也會增加大小!),它的工作原理!因此,在安裝過程中,似乎NSIS或負責生成/解析.lnk文件的後臺Windows進程沒有在新創建的環境變量上採用。我搜遍了網頁,似乎一切都表明我正在使用的SendMessage應該強制所有東西都知道新創建的env變量。預先感謝誰能解決這個謎團。您可以使用附帶的installer.nsi腳本來複制我的情況。另請注意,它在多種環境(XP,Vista,7,帶/不帶管理員等)中表現出這種行爲。
哇 - 確定加入這些調用迫使.LNK工作!萬歲! :)但是,我仍然需要進行WriteRegStr調用,以便在系統屬性 - >高級 - >環境變量中定義變量。沒有什麼大不了的。你是一個救星,男人! Preesh! – arette
是的,系統調用只適用於安裝程序... – Anders
再次感謝 - 希望這將有助於其他人也因爲我已經花了我的腦子幾天在這一個... :) – arette