【免費註冊】 【會員登入】 【個人資料】 【會員列表】 【論壇幫助】 【論壇搜尋】 【登出論壇】

∮Ω奧米加空間∮
∮Ω奧米加空間∮»技術文件區»【原創】編寫 NSIS 的安裝腳本

訂覽該主題更新消息 | 將該主題推薦給朋友 發表新主題 發起投票  回覆
作者 主題    
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 1 篇) 【原創】編寫 NSIS 的安裝腳本

前言:
如果你是第一次製作安裝程式,建議你使用 Setup Factory 或 CreateInstall
因為這兩個安裝程式是圖形介面非常的適合初學者使用。筆者一開始也不會使用
NSIS 寫腳本而是先從上面兩套軟體著手,了解安裝程式的流程與基礎才進而使用
Nullsoft Installation System 來製作安裝程式。

同一個程式用這三套軟體以最精簡的流程製作出來的安裝程式其大小如下

-----------------------------------------------
原始程式                         248 KB
Setup Factory                  488 KB
CreateInstall                   156 KB
Nullsoft Installation System    134 KB
-----------------------------------------------

我本來是想直接用 CreateInstall 來製作安裝程式就好因為它是圖形介面簡單
作出來的檔案也很小。但是他作出來的安裝程式在繁體中文系統底下有一個BUG
讓我非放棄他不可。就是建立捷徑在「開始」功能表 -> 程式集 裡他會因為
BIG5 裡面的 "功" 含有 "\" 而建立成 「開始」-> 能表 -> 程式集 少了一個
字作出來的捷徑也不能用 >_<" 想辦法跟作者聯絡但是我英文實在很破.......
前言到此結束底下開始是教學了

==========================================================

本教學以 KYO 網友所著的 ShellInfoTip 為例子,因為它需要做到下列三項

1.註冊 DLL 檔案
2.註冊 REG 登錄檔案
3.在 WIN 路徑裡放置 STPlugin.ini

我先在這裡簡單的描述所需用到的參數在文章結尾處我會放上 ShellInfoTip.nsi
腳本檔案我有寫上詳細的註解,這裡以提出所需要的三項功能作為主要介紹。有
不知道不了解不清楚或我沒提及的參數,你可以查找 NSIS 的使用說明書他寫的
非常詳細。


1.註冊 DLL 檔案
RegDLL "$INSTDIR\ShellTip4Rar.dll"

其中 $INSTDIR 是代表你安裝的目錄
如:你是裝在 c:\emp\ShellInfoTip 底下,他的 $INSTDIR 就是這個目錄會隨著你的安裝路徑而變動。


2.註冊 REG 登錄檔案
WriteRegStr HKCR ".rar\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"
WriteRegStr HKCR ".exe\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"
WriteRegStr HKCR ".001\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"


WriteRegStr 是寫入類型為 REG_SZ 的數值
HKCR 是 HKEY_CLASSES_ROOT 的縮寫

原始程式所要註冊的登錄檔內容如下
-----------------------------------------------------------------------
REGEDIT4

[HKEY_CLASSES_ROOT\.rar\ShellEx]

[HKEY_CLASSES_ROOT\.rar\ShellEx\{00021500-0000-0000-c000-000000000046}]
@="{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"

[HKEY_CLASSES_ROOT\.exe\ShellEx]

[HKEY_CLASSES_ROOT\.exe\ShellEx\{00021500-0000-0000-c000-000000000046}]
@="{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"

[HKEY_CLASSES_ROOT\.001\ShellEx]

[HKEY_CLASSES_ROOT\.001\ShellEx\{00021500-0000-0000-c000-000000000046}]
@="{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"
-----------------------------------------------------------------------


3.在 WIN 路徑裡放置 STPlugin.ini
WriteINIStr "$WINDIR\STPlugin.ini" "Plugin" "Plugin1" "$INSTDIR\rar_txt.dll"

$WINDIR 是 Windows 系統的目錄
WriteINIStr 是寫入 INI 檔案,按照順序寫入 ini 的檔案名稱、區域名稱、變數名稱、數值。

原始程式的 STPlugin.ini 檔內容如下
-------------------------------------------------
[Plugin]
Plugin1=安裝路徑名\rar_txt.dll
-------------------------------------------------


三項主要的功能介紹就到此結束了底下開始是ShellInfoTip.nsi腳本檔案的內容


==========================================================
; ShellInfoTip.nsi
; 本安裝程式由 DC 編寫製作
; ∮Ω奧米加空間∮ http://omega.idv.tw/kdb120/
;

;宣告軟體名稱,後面可以利用 ${NAME} 調用這個名字
!define NAME "ShellInfoTip"

;設定字型
SetFont 新細明體 9

;使用 WindowsXP 視覺樣式
XPstyle on

;安裝視窗的標題名稱
Caption /LANG=1028 "安裝 Winrar Shell Info Tip 功能"

;替換預設的按鈕文字
MiscButtonText /LANG=1028 "< 上一步" "下一步 >" "取消" "關閉"

;替換預設的按鈕文字
InstallButtonText /LANG=1028 "安裝"

;替換預設的按鈕文字
UninstallButtonText /LANG=1028 "反安裝"

;替換反安裝程序的文字
DirText /LANG=1028 "歡迎您安裝 Shell Info Tip 這是個自由軟體版權歸原作者 KYO 所有。此安裝程式由∮Ω奧米加空間∮ 壇主 DC 提供製作。" "請選擇欲安裝 ${NAME} 的目錄:" "瀏覽..."

;替換反安裝程序的文字
UninstallText /LANG=1028 "現在將從你的系統中反安裝 ${NAME} 。如果你觸發了 ${NAME} 的功能 ShellTip4Rar.dll 動態連結檔必須重開機之後才可以被刪除。" "反安裝目錄:"

;替換反安裝程序標題的文字
UninstallCaption /LANG=1028 "反安裝 ${NAME}"

;替換反安裝程序的文字
DetailsButtonText /LANG=1028 "顯示詳細過程"

;替換反安裝按鈕的文字
UninstallButtonText /LANG=1028 "反安裝"

;反安裝程序顯示方式 預設是隱藏
ShowUninstDetails hide

;替換空間的文字
SpaceTexts /LANG=1028 "所需的空間 " "可用的空間 "

;這個安裝程式的名稱
Name "ShellInfoTip"

;輸出製作完成的安裝程式檔案
OutFile "ShellInfoTip.exe"

;預設的安裝程式目錄在 Program Files 裡
InstallDir $PROGRAMFILES\${NAME}


;底下開始是安裝程式所要執行的
Section "Install"

;設定輸出的路徑在安裝程式的目錄
SetOutPath $INSTDIR

;貼上你所要包裝在安裝程式裡的檔案
File "C:\Files\rar_txt.dll"
File "C:\Files\ShellTip4Rar.dll"

;註冊 DLL 檔案
RegDLL "$INSTDIR\ShellTip4Rar.dll"

;寫入欲註冊的值在 HKEY_CLASSES_ROOT 裡類型為 REG_SZ
WriteRegStr HKCR ".rar\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"
WriteRegStr HKCR ".exe\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"
WriteRegStr HKCR ".001\ShellEx\{00021500-0000-0000-c000-000000000046}" "" "{C34C25BE-9B2B-4A50-9D97-2658E0D8796B}"

;寫入 INI 檔
WriteINIStr "$WINDIR\STPlugin.ini" "Plugin" "Plugin1" "$INSTDIR\rar_txt.dll"

;在程式集裡建立反安裝程序的捷徑
CreateDirectory "$SMPROGRAMS\${NAME}"
CreateShortCut "$SMPROGRAMS\${NAME}\反安裝 ${NAME}.lnk" \
               "$INSTDIR\uninst.exe"

;寫入建立反安裝程序要跟上面所連結的檔名一樣
WriteUninstaller "$INSTDIR\uninst.exe"

SectionEnd
;安裝程式過程到此結束


;反安裝程序內容
Section "Uninstall"

;循環刪除檔案直到刪除資料夾
UnRegDLL "$INSTDIR\ShellTip4Rar.dll"
Delete "$INSTDIR\*.*"
Delete "$WINDIR\STPlugin.ini"
Delete "$SMPROGRAMS\${NAME}\*.*"
RMDir "$SMPROGRAMS\${NAME}"
RMDir "$INSTDIR"

;寫入欲刪除註冊的值
DeleteRegKey HKCR ".rar\ShellEx"
DeleteRegKey HKCR ".exe\ShellEx"
DeleteRegKey HKCR ".001\ShellEx"
SectionEnd
;反安裝程序過程到此結束

; eof




本帖由dc最後編輯於2003-01-25 02:54

Your mind to my mind,

your thought to my thought
發表時間:2003-01-22 12:49
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:211.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 2 篇)

一邊增加資料等夠了之後再集成一篇教學,上一篇有說過的值跟變數這裡就不在重提了。


抓取舊軟體的安裝目錄
這項功能在更新版本與中文化時滿實用的,因為使用者不可能 100% 都用軟體預設的安裝路徑,這時我們設定用之前安裝的路徑方便使用者也方便我們
PS:前提是那套軟體有將註冊資訊寫入註冊表才行喔~

以 ICQ Ad Killer 為例匯出 REG 如下
-------------------------------------------------------------------------
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ICQ Ad Killer]
"install_dir"="C:\Program Files\ICQ200b"
"version"="1.4a"
-------------------------------------------------------------------------

我們要抓出他安裝的路徑語法為

nsis 新版本已改成用這各方式抓取
InstallDirRegKey HKLM "SOFTWARE\ICQ Ad Killer" "install_dir"

ReadRegStr $INSTDIR HKLM "SOFTWARE\ICQ Ad Killer" "install_dir"
ReadRegStr 讀取類型為 REG_SZ 的數值
$INSTDIR 為安裝的路徑 這邊的 $參數 有一定的格式不能亂指定
HKLM 是 HKEY_LOCAL_MACHINE 的縮寫
在來寫上機碼的路徑
最後是我們要取得值的名稱




本帖由dc最後編輯於2008-07-25 11:06

Your mind to my mind,

your thought to my thought
發表時間:2003-01-25 03:22
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:211.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 3 篇) 【原創】多國語言安裝腳本

; editplus.nsi
; 本安裝程式由 DC 編寫製作
; ∮Ω奧米加空間∮ http://omega.idv.tw/kdb120/
;

;宣告多國語言標籤
LangString chinese 1028 "繁體中文版"
LangString chinese 2052 "潠极笢恅唳"

;使用 lzma 壓縮,將所有的檔案當作同一個資料流壓縮
SetCompressor        /FINAL /SOLID lzma

;宣告軟體名稱
!define NAME "EditPlus V2.20 284 $(chinese)"

Name "${NAME}"

;軟體版本號碼 1 ,如 Editplus 2.20.284 三位
!define PRODUCT_VERSION "2.20_284"                            

;程式名稱 (可使用大小寫,如果有空格,請用底線取代)
!define PRODUCT_NAME  "EditPlus"            

;使用多國語言套件
!include "MUI.nsh"

;繁體歡迎視窗
LangString WELCOMETEXT 1028 "歡迎您使用 ${NAME} 。此中文版由\r\n\r\n∮Ω奧米加空間∮\r\n\r\nhttp://omega.idv.tw/kdb120/ \r\n\r\n站長 DC 提供製作。\r\n\r\n\r\n$_CLICK"

;簡體歡迎視窗
LangString WELCOMETEXT 2052 "辣茩蠟妏蚚 ${NAME} ﹝森笢恅唳蚕\r\n\r\n±次兜譙樓諾潔±\r\n\r\nhttp://omega.idv.tw/kdb120/ \r\n\r\n桴酗 DC 枑鼎秶釬﹝\r\n\r\n\r\n$_CLICK"

!define MUI_WELCOMEPAGE_TEXT "$(WELCOMETEXT)"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\editplus.exe"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "TradChinese"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

;輸出檔案名稱
OUTFILE            "HA_EditPlus_220_284_DC.exe"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"

Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

;不同語言的主程式
LangString file 1028 "editpluscht.exe"
LangString file 2052 "editpluschs.exe"

Section "$(S01)" SecS01
;貼上你所要包裝在安裝程式裡的檔案
SetOutPath $INSTDIR
;要包裝的程式路徑
File "c:\cpatchepp284\*.*"
;建立反安裝程式
WriteUninstaller "$INSTDIR\uninst.exe"
Delete "$INSTDIR\editplus.exe"
Rename $INSTDIR\$(file) $INSTDIR\editplus.exe
Delete "$INSTDIR\editpluscht.exe"
Delete "$INSTDIR\editpluschs.exe"
SectionEnd
;安裝程式過程到此結束

;加入捷徑到桌面
Section "$(S11)" SecS11
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\editplus.exe"
SectionEnd
;加入捷徑到選單
Section "$(S12)" SecS12
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\editplus.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall ${PRODUCT_NAME}.lnk"  "$INSTDIR\uninst.exe"
;寫入建立反安裝程序要跟上面所連結的檔名一樣
SectionEnd

;選取功能表單控制項
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecS01}      $(DESC_SecS01)
!insertmacro MUI_DESCRIPTION_TEXT ${SecS11}      $(DESC_SecS11)
!insertmacro MUI_DESCRIPTION_TEXT ${SecS12}      $(DESC_SecS12)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

;選取功能表單控制項說明(多國語言)
LangString S01             ${LANG_TRADCHINESE}     "${PRODUCT_NAME} 主程式"
LangString S11             ${LANG_TRADCHINESE}     "加入捷徑到桌面"
LangString S12             ${LANG_TRADCHINESE}     "加入捷徑到程式集"
LangString DESC_SecS01     ${LANG_TRADCHINESE}     "安裝 ${PRODUCT_NAME} 主程式。若這一項沒有選擇,就沒有程式可以安裝了。"
LangString DESC_SecS11     ${LANG_TRADCHINESE}     "將主程式的捷徑放在桌面上方便拖拉與日常使用。"
LangString DESC_SecS12     ${LANG_TRADCHINESE}     "將主程式和反安裝的捷徑放到程式集裡。"

LangString S01             ${LANG_SIMPCHINESE}     "${PRODUCT_NAME} 翋最唗"
LangString S11             ${LANG_SIMPCHINESE}     "樓辦豎源宒善袤醱"
LangString S12             ${LANG_SIMPCHINESE}     "樓辦豎源宒善最唗"
LangString DESC_SecS01     ${LANG_SIMPCHINESE}     "假蚾 ${PRODUCT_NAME} 翋最唗﹝涴珨砐帤恁隅ㄛ憩羶衄最唗褫眕假蚾賸﹝"
LangString DESC_SecS11     ${LANG_SIMPCHINESE}     "蔚翋最唗腔辦豎源宒溫婓袤醱奻源晞迍嶺迵都妏蚚﹝"
LangString DESC_SecS12     ${LANG_SIMPCHINESE}     "蔚翋最唗睿毀假蚾腔辦豎源宒溫善最唗爵﹝"

Section "Uninstall"
;循環刪除檔案直到刪除資料夾
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\*.*"
Delete "$INSTDIR\*.*"
RMDir "$SMPROGRAMS\${PRODUCT_NAME}"
RMDir /r "$INSTDIR"
SectionEnd






Your mind to my mind,

your thought to my thought
發表時間:2005-11-13 12:21
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:192.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 4 篇)

資料來源:快樂無極的博客

NSIS安裝過程生成log,卸載過程調用log卸載文件

Inno Setup製作的安裝程序在安裝時能記錄安裝內容,生成unins000.dat之類的文件,卸載時直接調用它。這樣可以避免卸載時誤刪文件。
NSIS 的卸載段一般是手寫,如果安裝程序包含的文件很多,一般就直接刪除整個安裝目錄,或者逐個刪除子目錄,再逐個刪除安裝目錄下的各個文件。這樣存在誤刪除文件的危險性。比如如果用戶將文件存放在驅動器根目錄下,如果整個刪除安裝目錄,那就將一個驅動器的東西都刪光了!況且更新維護腳本的同時需要考慮到卸載段的更改,個人覺得是比較麻煩。unhappy這也是我不太喜歡NSIS的原因之一。(還有另一個重要原因是NSIS製作的安裝程序在安裝時如果「取消」了安裝,將不能回復到安裝前的狀態,而INNO可以哦!這和本文無關~)

其實NSIS也提供了LOG功能,只是在正式發行版本裡沒有開啟,必須使用它的特殊編譯器。而這個Special Build官方早就為你想到了,在NSIS的全部文件下載頁面裡就有:http://sourceforge.net/project/showfiles.php?group_id=22049
其中每個版本出來,都有個LOG.zip。 如 nsis-2.37-log.zip ,這就是2.37版的開啟LOG功能的版本。安裝了正式發行的版本,再解包這個LOG的ZIP文件到安裝目錄,覆蓋掉原文件。

如何使用這個功能?

HM VNISEdit 的嚮導可以自動生成「安全卸載」的代碼,就是以下的內容:

1、在普通安裝腳本前添加庫
!include "LogicLib.nsh"
          
2、 激活安裝日誌記錄,該日誌文件將會作為卸載文件的依據(注意,本區段必須放置在所有區段之前)

Section "-LogSetOn"
  LogSet on
SectionEnd



3、

/******************************
*  以下是安裝程序的卸載部分  *
******************************/

; 根據安裝日誌卸載文件的調用宏
!macro DelFileByLog LogFile
  ifFileExists `${LogFile}` 0 +4
    Push `${LogFile}`
    Call un.DelFileByLog
    Delete `${LogFile}`
!macroend

Section Uninstall
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  Delete "$INSTDIR\${PRODUCT_NAME}.url"

  ; 調用宏只根據安裝日誌卸載安裝程序自己安裝過的文件
  !insertmacro DelFileByLog "$INSTDIR\install.log"
; 清除安裝程序創建的且在卸載時可能為空的子目錄,對於遞歸添加的文件目錄,請由最內層的子目錄開始清除(注意,不要帶 /r 參數,否則會失去 DelFileByLog 的意義)
  RMDir "$SMPROGRAMS\$ICONS_GROUP"
SectionEnd


#-- 根據 NSIS 腳本編輯規則,所有 Function 區段必須放置在 Section 區段之後編寫,以避免安裝程序出現未可預知的問題。--#
; 以下是卸載程序通過安裝日誌卸載文件的專用函數,請不要隨意修改
Function un.DelFileByLog
  Exch $R0
  Push $R1
  Push $R2
  Push $R3
  FileOpen $R0 $R0 r
  ${Do}
    FileRead $R0 $R1
    ${IfThen} $R1 == `` ${|} ${ExitDo} ${|}
    StrCpy $R1 $R1 -2
    StrCpy $R2 $R1 11
    StrCpy $R3 $R1 20
    ${If} $R2 == "File: wrote"
    ${OrIf} $R2 == "File: skipp"
    ${OrIf} $R3 == "CreateShortCut: out:"
    ${OrIf} $R3 == "created uninstaller:"
      Push $R1
      Push `"`
      Call un.DelFileByLog.StrLoc
      Pop $R2
      ${If} $R2 != ""
        IntOp $R2 $R2 + 1
        StrCpy $R3 $R1 "" $R2
        Push $R3
        Push `"`
        Call un.DelFileByLog.StrLoc
        Pop $R2
        ${If} $R2 != ""
          StrCpy $R3 $R3 $R2
          Delete /REBOOTOK $R3
        ${EndIf}
      ${EndIf}
    ${EndIf}
    StrCpy $R2 $R1 7
    ${If} $R2 == "Rename:"
      Push $R1
      Push "->"
      Call un.DelFileByLog.StrLoc
      Pop $R2
      ${If} $R2 != ""
        IntOp $R2 $R2 + 2
        StrCpy $R3 $R1 "" $R2
        Delete /REBOOTOK $R3
      ${EndIf}
    ${EndIf}
  ${Loop}
  FileClose $R0
  Pop $R3
  Pop $R2
  Pop $R1
  Pop $R0
FunctionEnd

Function un.DelFileByLog.StrLoc
  Exch $R0
  Exch
  Exch $R1
  Push $R2
  Push $R3
  Push $R4
  Push $R5
  StrLen $R2 $R0
  StrLen $R3 $R1
  StrCpy $R4 0
  ${Do}
    StrCpy $R5 $R1 $R2 $R4
    ${If} $R5 == $R0
    ${OrIf} $R4 = $R3
      ${ExitDo}
    ${EndIf}
    IntOp $R4 $R4 + 1
  ${Loop}
  ${If} $R4 = $R3
    StrCpy $R0 ""
  ${Else}
    StrCpy $R0 $R4
  ${EndIf}
  Pop $R5
  Pop $R4
  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
FunctionEnd
    

按照上面的方法,就可以編譯腳本了。

NSIS就是這麼麻煩。生成的install.log沒有經過任何的加密,用記事本就完全可以看到做了什麼東西。




本帖由dc最後編輯於2008-07-29 15:08

Your mind to my mind,

your thought to my thought
發表時間:2006-01-26 18:15
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:192.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 5 篇)

安裝完畢按下完成之後開啟網頁

Function .onInstSuccess
ExecShell "open" "http://omega.idv.tw/kdb120"
  FunctionEnd



4.9.1.3 ExecShell
動作命令[參數] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]
使用Windows的外殼關聯來執行一個指定的程序。注意“動作”通常為open 、 print等等,也可以是一個空字串來使用默認動作。參數和顯示類型是可選項。 $OUTDIR用於指定工作路徑。如果該命令不能被運行則會置一個錯誤標記。

ExecShell "open" "http://nsis.sf.net/"
ExecShell "open" "$INSTDIR\readme.txt"
ExecShell "print" "$INSTDIR\readme.txt"




本帖由dc最後編輯於2009-05-12 16:56

Your mind to my mind,

your thought to my thought
發表時間:2009-05-12 16:56
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:210.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 6 篇)

如果有一個大量的安裝檔案,安裝時需要快速調用出來使用的話往往要等檔案全部解壓才可以調用
可以利用 ReserveFile 函數將檔案放置在檔尾快速調用


;在 nisi 檔案開頭加入
ReserveFile "c:\123.exe"


;調用的方式
Function .onInit

;將 123.exe 程式解壓縮到系統預設的 TEMP 目錄
SetOutPath $TEMP

; 123.exe 檔案的位置
File "c:\123.exe"

FunctionEnd






Your mind to my mind,

your thought to my thought
發表時間:2009-06-01 17:09
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:210.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 7 篇)

查詢根值是否存在的話要使用 EnumRegKey


EnumRegKey $R0 HKLM "SOFTWAREest" ""
IFErrors 0 NoError ;如果不存在終止程式,如果存在移到 NoError:
  Abort
NoError:






Your mind to my mind,

your thought to my thought
發表時間:2009-06-01 17:12
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:210.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 8 篇)

由於 NSIS 有上限 2GB 的限制,假如你的原始檔案大於 2GB 但是壓縮之後小於 2GB
可以利用 7zip 將原始檔案壓縮到 2GB 以下,然後 nsis 調用 7zip 來解壓縮

首先請到官網下載 7z 插件
http://nsis.sourceforge.net/Nsis7z_plug-in
記得 nsis7z.dll 要放在 \NSIS\Plugins\ 的目錄下程式才可以調用~

範例如下

; The stuff to install
Section "" InstTest ;No components page, name is not important

  ; Set output path to the installation directory.
  SetOutPath $INSTDIR
  SetCompress off
  DetailPrint "正在進行複製中..."
  SetDetailsPrint listonly
  File "H:\Test.7z"
  SetCompress auto
;  File /nonfatal /oname=$PLUGINSDIR\nsis7z.pdb Release\nsis7z.pdb
  SetDetailsPrint both

  ; Usual mode - set unpacking prompt using DetailPrint,
  ; plugin will animate progress bar
; DetailPrint "Installing package..."
; Nsis7z::Extract "Test.7z"

  ; Details mode - unpacking promt generated from second param, use
  ; %s to insert unpack details like "10% (5 / 10 MB)"
  Nsis7z::ExtractWithDetails "Test.7z" "安裝進度為 %s..."

  ; Callback mode - plugin will animate progress bar, you can do
  ; anything in callback function
; GetFunctionAddress $R9 CallbackTest
;  Nsis7z::ExtractWithCallback "Test.7z" $R9
  Delete "$OUTDIR\Test.7z"

SectionEnd ; end the section

因為這樣載入的話程式只會抓到 7z 的檔案大小,看語法可以知道程式是將 7z 檔拷貝到硬碟解壓縮之後再刪除
所以我們需要使用 SectionSetSize 來自訂所需空間大小如下

Function .onInit
  # set required size of section 'InstTest'
  SectionSetSize ${InstTest} 10485760 ;10485760=10GB  1024*1024=1GB

FunctionEnd




本帖由dc最後編輯於2009-06-01 17:40

Your mind to my mind,

your thought to my thought
發表時間:2009-06-01 17:32
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:210.*.*.* 編輯  引言回覆 
dc
管理員



性別:男
來自:瓦肯星
發表總數:10744
註冊時間:2002-05-07 16:32
(第 9 篇)

資料來源愛在西元前

桌面快捷方式關聯圖標文件的解決方法
CreateShortCut "$desktop\Demo.lnk" "$INSTDIR\Demo.exe" "" "X:\Demo.ico"






Your mind to my mind,

your thought to my thought
發表時間:2010-06-17 00:11
dc的個人資料 傳送郵件給dc dc的個人首頁 dc發表的所有文章 送出悄悄話給dc IP:114.*.*.* 編輯  引言回覆 
所有時間均為GMT+8, 現在是2024-05-21 03:34    
訂覽該主題更新消息 | 將該主題推薦給朋友 發表新主題 發起投票  回覆

快速回覆
主題 ( 回覆文章可以不輸入標題 )
URLs自動分析
有回覆時郵件通知
禁用表情符號
使用簽名

<聯絡我們 - OMEGA - 控制面板>

Powered by Centaur & Joksky & DC, ver 2003.08.14
Copyright ©2002-2008 PHPY.COM


頁面生成時間:0.010267019271851