上一頁 | 目錄 | 下一頁

4.9 指令

4.9.1 基本指令

NSIS 用於腳本的這些指令稍微的近似於 PHP 和彙編。它們沒有真正的高級語言結構,但是他們的指令(對於絕大部分)卻是高級的,並且你可以很容易的掌握(比如你不用擔心字串的連接等等)。基本上你有 25 個寄存器(20 個慣用用途,5 個特殊用途),和一個堆棧。

4.9.1.1 Delete

[/REBOOTOK] 檔案

從目標系統刪除檔案(可以是檔案或通配符,但必須指定一個完整的路徑)。如果指定了 /REBOOTOK 並且該檔案目前不可刪除,則會在系統重啟時刪除該檔案 -- 如果該檔案要在系統重啟時刪除,你還要設定一個重啟的標記。如果找到的檔案不能被刪除則會置一個錯誤標記。但該錯誤標記不是為嘗試刪除一個不存在的檔案設定的。

Delete $INSTDIR\somefile.dat

4.9.1.2 Exec

命令

執行一個指定的程式並且立即繼續安裝。注意指定的檔案必須存在於目標系統而不是編譯的系統。$OUTDIR 用於指定工作路徑。如果該命令不能被運行則會置一個錯誤標記。注意,如果該命令包含有空格,你要用引號來把他們包括起來。例如:Exec '"$INSTDIR\command.exe" 參數'。如果你不用引號括起來則在 Windwos 9X 下不正常或丟失參數。

Exec '"$INSTDIR\someprogram.exe"'
Exec '"$INSTDIR\someprogram.exe" some parameters'

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"

4.9.1.4 ExecWait

命令 [用戶變量(返回代碼)]

執行一個指定的程式並且等待運行處理結束。更多訊息請觀看 Exec。當程式執行返回一個非零錯誤代碼,或者當產生錯誤時如果沒有指定「用戶變量(返回代碼)」 則ExecWait 會置一個錯誤標記。如果指定了「用戶變量(返回代碼)」,ExecWait 會把變量設為返回代碼(並且僅當產生錯誤時置一個錯誤標記;如果產生錯誤則該用戶變量的內容為未指定)。注意,如果該命令包含有空格,你要用引號來把他們包括起來。例如:Exec '"$INSTDIR\command.exe" 參數'。如果你不用引號括起來則在Windwos 9X 下不正常或丟失參數。

ExecWait '"$INSTDIR\someprogram.exe"'
ExecWait '"$INSTDIR\someprogram.exe"' $0
DetailPrint "程式返回了 $0"

4.9.1.5 File

[/nonfatal] [/a] ([/r] [/x 檔案|通配符 [...]] (檔案|通配符) [...] | /oname=輸出路徑\檔案名稱 輸入路徑\檔案名稱)

釋放檔案到目前輸出路徑($OUTDIR)。

File something.exe
File /a something.exe
File *.exe
File /r *.dat
File /r data
File /oname=$TEMP\temp.dat somefile.ext
File "/oname=$TEMP\name with spaces.dat" somefile.ext
File /nonfatal "一個可能不存在的檔案"
File /r /x CVS myproject\*.*
File /r /x *.res /x *.obj /x *.pch source\*.*

4.9.1.6 Rename

[/REBOOTOK] 源檔案 目標檔案

把 源檔案 重命名為 目標檔案。你可以用它來把用戶系統裡的任何地方的一個檔案移動到用戶系統裡的任何地方,你也可以在一些驅動器上把一個目錄移動到某些地方。目標檔案必須不存在否則移動失敗(除非你使用了 /REBOOTOK)。如果指定了 /REBOOTOK,並且當檔案不能移動時(比如,目標檔案已存在),則該檔案在系統重啟後才被移動到目標。如果檔案在重啟後才被移動,則會放置一個重啟的標記。當檔案不能被重命名時(並且沒有使用 /REBOOTOK)或者原檔案不存在時,會放置一個錯誤標記。

如果沒有指定絕對路徑則使用目前路徑代替。目前路徑可以使用 SetOutPath 指令來設定。如果你沒有使用 SetOutPath 那麼目前路徑為 $EXEDIR

Rename $INSTDIR\file.ext $INSTDIR\file.dat

4.9.1.7 ReserveFile

[/nonfatal] [/r] [/x file|wildcard [...]] 檔案 [檔案...]

把檔案儲存在稍後使用的資料區塊。檔案將按照在腳本裡出現的次序依次新增到壓縮的資料區塊。因為函數不必要按照它們出現在腳本裡的次序調用,因此如果你把檔案新增到一個早期就調用但卻放在腳本最後的函數的時候,早期需要的檔案需要解壓出來,那麼當檔案很多的時候就需要很長的時間去解壓這些檔案。.onInit 就是這樣的一個函數。它總是在安裝程式初始化的時候被調用,如果你把這個函數放在了腳本的最後,這個函數所需要的檔案之前還有很多檔案,那麼當你解壓這些需要的檔案的時候安裝程式就需要大量的時間才能載入。這就是為什麼這個命令很有用的原因,這個命令能加快安裝程式的載入,使用這個命令後它可以把早期需要的檔案新增到資料區塊的頂端而不是讓 NSIS 把壓縮的資料區塊從頂端搜尋到底部後才把這些檔案解壓出來。

相關參數說明請觀看 File

4.9.1.8 RMDir

[/r] [/REBOOTOK] 目錄名

刪除指定的目錄(完整路徑)。沒有 /r 參數時只有在目錄為空時才會被刪除。如果指定了 /r,則目錄會被遞歸刪除,所以在指定目錄下的所有檔案和目錄均被刪除。如果指定了 /REBOOTOK,任何目前不能刪除的檔案或目錄將會在重啟後被刪除 —— 如果檔案或目錄需要在重啟時被刪除,會放置一個重啟的標記。當檔案或目錄不能被刪除時放置一個錯誤的標記。

RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTIDR
RMDir /REBOOTOK $INSTDIR\DLLs

需要注意的是目前的工作目錄不能刪除。目前的工作目錄由 SetOutPath 設定。例如,下面的例子裡將不能刪除該目錄。

SetOutPath $TEMP\dir
RMDir $TEMP\dir

而下面的例子可以刪除該目錄。

SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir

4.9.1.9 SetOutPath

輸出路徑

設定輸出路徑($OUTDIR)且當路徑不存在時建立(需要時會遞歸建立)。必須為全路徑名,通常都使用 $INSTDIR。

SetOutPath $INSTDIR
File program.exe

4.9.2 註冊表、INI 檔案指令

在下面所有的註冊表指令裡你可以使用一個空字串("")來作為某個子健預設項,該預設項在註冊表編輯器裡顯示為「(預設)」。

如果要處理的 INI 檔案的路徑沒有指定,則使用 Windows 目錄來代替。

4.9.2.1 DeleteINISec

INI檔案 區段

從「INI檔案」 裡刪除整個區段 「區段」。如果該區段不能被刪除,會放置一個錯誤的標記。但是如果該區段找不到時則不會放置錯誤標記。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true
DeleteINISec $TEMP\something.ini section1

4.9.2.2 DeleteINIStr

INI檔案 區段 字串

從「INI檔案」 裡的 「區段」 區段刪除 「字串」 字串。如果該字串不能被刪除,會放置一個錯誤的標記。但是如果該字串找不到時則不會放置錯誤標記。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
DeleteINIStr $TEMP\something.ini section1 somethingelse

4.9.2.3 DeleteRegKey

[/ifempty] 根鍵 子鍵

刪除一個註冊表鍵。如果指定了 /ifempty,則該註冊表鍵僅當它無子鍵時才會被刪除(否則,整個註冊表鍵將被刪除)。有效的根鍵值在後面的 WriteRegStr 列出。如果該鍵不能被刪除(或如果它不存在)則會放置一個錯誤的標記。

DeleteRegKey HKLM "Software\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"

4.9.2.4 DeleteRegValue

根鍵 子鍵 鍵名

刪除一個註冊表鍵值。有效的根鍵值在後面的 WriteRegStr 列出。如果該鍵值不能被刪除(或如果它不存在)則會放置一個錯誤的標記。

DeleteRegValue HKLM "Software\My Company\My Software" "some value"

4.9.2.5 EnumRegKey

用戶變量(輸出) 根鍵 子鍵 索引

搜尋 「根鍵\子鍵」 第 「索引」 號註冊表的鍵並輸出到變量。有效的根鍵值在後面的 WriteRegStr 列出。當指定的 「根鍵\子鍵」 沒有任何鍵時會返回一個空字串,當產生一個錯誤時會返回空字串並放置一個錯誤標記。

StrCpy $0 0
loop:
  ClearErrors
EnumRegKey $1 HKLM Software $0 IfErrors done ;如果發生錯誤則提前結束 IntOp $0 $0 + 1 MessageBox MB_YESNO|MB_ICONQUESTION "$1$\n$\nMore?" IDYES loop done:

4.9.2.6 EnumRegValue

用戶變量(輸出) 根鍵 子鍵 索引

搜尋 「根鍵\子鍵」 第 「索引」 號註冊表的鍵值並輸出到變量。有效的根鍵值在後面的 WriteRegStr 列出。當指定的「根鍵\子鍵」沒有任何鍵值時會返回一個空字串,當產生一個錯誤時會返回空字串並放置一個錯誤標記。

StrCpy $0 0
loop:
  EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  ReadRegStr $2 HKLM Software\Microsoft\Windows\CurrentVersion $1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1 = $2$\n$\nMore?" IDYES loop
done:

4.9.2.7 ExpandEnvStrings

用戶變量(輸出) 字串

字串裡的環境變量展開到用戶變量 $x。如果環境變量不存在則字串不會被替換。例如,你使用 %var% 而 var 不存在,輸出還是 %var%。.如果發生錯誤,該變量會被設為空值並放置一個錯誤標記。

ExpandEnvStrings $0 "WINDIR=%WINDIR%$\nTEMP=%TEMP%"

4.9.2.8 FlushINI

INI檔案名稱

更新 INI 檔案緩衝。Windows 9x 會保持 INI 檔案在記憶體裡。該命令強制更改立即寫入磁碟。當你自己編輯一個 INI 檔案的時候可以使用它,刪除、移動、複製,直到你使用 WriteINIStrDeleteINISecDeleteINStr 來更改它。

WriteINIStr $TEMP\something.ini test test test
FlushINI $TEMP\something.ini
Delete $TEMP\something.ini

4.9.2.9 ReadEnvStr

用戶變量(輸出) 名稱

從環境字串「名稱」讀取值並把值賦給用戶變量 $x。如果讀取字串時有錯誤發生,該用戶變量被設為空,並放置一個錯誤標記。

ReadEnvStr $0 WINDIR
ReadEnvStr $1 TEMP

4.9.2.10 ReadINIStr

用戶變量(輸出) INI檔案 區段 項

從 「INI檔案」 的 「區段」 區段讀取 「項」 的值並把該值輸出到用戶變量。如果該項未找到時會放置一個錯誤標記且該用戶變量被賦為空值。

ReadINIStr $0 $INSTDIR\winamp.ini winamp outname

4.9.2.11 ReadRegDWORD

用戶變量(輸出) 根鍵 子鍵 項

從註冊表讀取一個 32 位 DWORD 並輸出到用戶變量。有效的根鍵值在後面的 WriteRegStr 列出。如果 DWORD 不存在時會放置一個錯誤標記並把 $x 設為空字串。如果該值存在但不是 DWORD,則會作為字串類型讀取並放置一個錯誤標記。

ReadRegDWORD $0 HKLM Software\NSIS VersionBuild

4.9.2.12 ReadRegStr

用戶變量(輸出) 根鍵 子鍵 項

從註冊表讀取一個字串值並輸出到用戶變量。有效的根鍵值在後面的 WriteRegStr 列出。如果字串不存在時會放置一個錯誤標記並把 $x 設為空字串。如果該值存在但是 DWORD,則會轉換為字串類型並放置一個錯誤標記。

ReadRegStr $0 HKLM Software\NSIS ""
DetailPrint "NSIS 安裝在: $0"

4.9.2.13 WriteINIStr

INI檔案 區段 項 值

把 「項」 = 「值」 寫入 「INI檔案」 的 「區段名」 區段。如果 INI 檔案不能寫入則放置一個錯誤的標記。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true

4.9.2.14 WriteRegBin

根鍵 子鍵 項 值資料

該命令將會寫一個區塊的二進制資料到註冊表。有效的根鍵值在後面的 WriteRegStr 列出。值資料為十六進制格式(如 DEADBEEF01223211151)。如果該二進制資料不能寫入註冊表則放置一個錯誤的標記。如果註冊表鍵不存在則會自動建立。「值資料」不能使用變量。

WriteRegBin HKLM "Software\My Company\My Software" "Binary Value" DEADBEEF01223211151

4.9.2.15 WriteRegDWORD

根鍵 子鍵 項 值

該命令寫一個 DWORD (32 位整數) 到註冊表(可以使用變量)。有效的根鍵值在後面的 WriteRegStr 列出。如果該 DWORD 不能寫入註冊表則會放置一個錯誤的標記。如果註冊表鍵不存在則會自動建立。

WriteRegDWORD HKLM "Software\My Company\My Software" "DWORD Value" 0xDEADBEEF

4.9.2.16 WriteRegStr

根鍵 子鍵 項 值

把字串寫入註冊表。詳細訊息請觀看 WriteRegExpandStr

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

4.9.2.17 WriteRegExpandStr

根鍵 子鍵 項 值

把字串寫入註冊表。根鍵必須為下面列表之一:

如果字串不能寫入註冊表則放置一個錯誤的標記。字串的類型為 REG_SZ 對應 WriteRegStr,或 REG_EXPAND_STR 對應 WriteRegExpandStr。如果註冊表鍵不存在則會自動建立。

WriteRegExpandStr HKLM "Software\My Company\My Software" "Expand String Value" "%WINDIR%\notepad.exe"

4.9.3 慣用用途指令

4.9.3.1 CallInstDLL

DLL檔案 [/NOUNLOAD] 函數

從一個 NSIS 擴展動態連結庫裡調用一個函數。看 Contrib\ExDLL 的例子可以知道如何來建立。擴展動態連結庫可以瀏覽堆棧和變量。使用 /NOUNLOAD 來強制安裝程式保持動態連結庫不卸載。注意: 要自動釋放並調用 DLL 插件請使用插件命令而不是 CallInstDLL。

Push "參數"
Push "另一個參數"
CallInstDLL $INSTDIR\somedll.dll somefunction

4.9.3.2 CopyFiles

[/SILENT] [/FILESONLY] 目標系統檔案規範 目標路徑 [檔案大小_單位為_kb]

在正在安裝的系統中把 「目標系統檔案(規範)」 複製到 「目標路徑」。如果你想從安裝媒體裡複製,或從系統的一個地方複製到另一個地方,你可以使用 $EXEDIR 變量來代替安裝程式目錄。如果複製操作需要很長時間的話你可以看到 Windows 的複製檔案視窗(要禁止出現複製檔案視窗使用/SILENT)。最後的參數用來指定要複製的檔案的大小(單位為 kb),使安裝程式可以估計所需磁碟空間。在出錯,或用戶登出(僅當忽略了 /SILENT 時)時,會放置一個錯誤標記。如果指定了 /FILESONLY 則僅複製檔案。

這個指令應該使用完整的路徑,使用相對路徑將得到不可預料的結果

CreateDirectory $INSTDIR\backup
CopyFiles $INSTDIR\*.dat $INSTDIR\backup

4.9.3.3 CreateDirectory

要建立的路徑

建立 (遞歸建立) 指定的目錄。當目錄不能建立時會放置一個錯誤標記。

你也可以指定一個絕對路徑。

CreateDirectory $INSTDIR\some\directory

4.9.3.4 CreateShortCut

快捷檔案.lnk 目標檔案 [參數 [圖檔檔案 [圖檔索引號 [啟動選項 [鍵盤快捷鍵 [描述]]]]]]

建立一個指向 「目標檔案」 的快捷方式 「快捷檔案.lnk」,可以帶 「參數」 參數。用於快捷方式的圖檔為 「圖檔檔案,圖檔索引號」;要使用預設圖檔的話把「圖檔檔案」 和 「圖檔索引號」 設為空字串。「啟動選項」 可以是它們之一: SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, 或一個空字串。 「鍵盤快捷鍵」 應該為 flag|c 格式且 flag 可以聯合使用(使用 |): ALT, CONTROL, EXT, 或 SHIFT。c 為要使用的字元(a-z, A-Z, 0-9, F1-F24 等等)。注意在這些字串裡不能含有空格。一個典型的例子為 "ALT|CONTROL|F8"。$OUTDIR 被用來作為工作目錄。你可以在建立快捷方式之前使用 SetOutPath 來指定或更改。「描述」 為快捷方式的描述,或在 XP 下作為註釋調用。當快捷方式不能建立的時候會放置一個錯誤標記(例如路徑 (連結路徑或目標路徑) 不存在或一些其它錯誤)。

CreateDirectory "$SMPROGRAMS\My Company"
CreateShortCut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \
  "some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \
  ALT|CTRL|SHIFT|F5 "a description"

4.9.3.5 GetDLLVersion

檔案名稱 用戶變量(高位DWORD輸出) 用戶變量(低位DWORD輸出)

從「檔案名稱」 DLL (或其他包含版本訊息的可執行檔案) 取得版本訊息。完成時把版本訊息高位 DWORD 和低位 DWORD 設為用戶輸出變量;失敗時輸出為空且置錯誤標記。下面的例子演示了讀取一個 DLL 版本並可讀的版本到 $0:

GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $0 "$R2.$R3.$R4.$R5"

4.9.3.6 GetDLLVersionLocal

內部檔案 用戶變量(高位DWORD輸出) 用戶變量(低位DWORD輸出)

類似於 GetDLLVersion,但它僅用於取得安裝程式內部檔案的訊息(它實際上編譯為兩個 StrCpy 命令)。完成時把內部檔案的版本訊息高位 DWORD 和低位 DWORD 設為用戶輸出變量。

4.9.3.7 GetFileTime

檔案名稱 用戶變量(高位DWORD輸出) 用戶變量(低位DWORD輸出)

取得 「檔案名稱」 的最後寫入時間。完成時把時間戳訊息高位 DWORD 和低位 DWORD 輸出到用戶輸出變量;失敗時輸出為空且置一個錯誤標記。

4.9.3.8 GetFileTimeLocal

內部檔案 用戶變量(高位DWORD輸出) 用戶變量(低位DWORD輸出

類似於 GetFileTime,但它僅用於取得安裝程式內部檔案的訊息(它實際上編譯為兩個 StrCpy 命令)。

4.9.3.9 GetFullPathName

[/SHORT] 用戶變量(輸出) 路經或檔案

把指定的檔案完整路徑訊息輸出到用戶變量。如果參數的部分路徑未找到,則會放置一個錯誤位標記並清除輸出變量。如果指定了 /SHORT,路經將會被轉換為短檔案名稱格式。

4.9.3.10 GetTempFileName

用戶變量(輸出) [基本路徑]

把一個臨時檔案的名稱輸出到用戶變量。該檔案會自動建立,所以你可以隨時的覆蓋它。該臨時檔案的名稱唯一。如果你希望這個臨時檔案建立在另一個目錄而不是 Windows 臨時目錄的話指定一個 「基本路徑」 給它。該臨時檔案需要在完成之後手動刪除。

GetTempFileName $0
File /oname=$0 something.dat
# 其它一些關於 something.dat 的操作
Delete $0

4.9.3.11 SearchPath

用戶變量(輸出) 檔案名稱

由第二個參數指定的檔案名稱的全路徑輸出到用戶變量。如果該檔案不存在則會置一個錯誤位標記並清除輸出的變量。使用 SearchPath() 來在系統目錄裡搜尋檔案。

4.9.3.12 SetFileAttributes

檔案名稱 屬性1|屬性2|...

設定檔案的屬性。多從屬性可用 | 隔開,有效的屬性為:

如果檔案的屬性不能被設定則置一個錯誤的標記(例如檔案不存在,或者你沒有足夠的權限)。你只能進行屬性設定,而不能移除屬性,如果你想移除的話請使用 NORMAL。這樣所有的屬性都會被擦除,該命令不支援通配符。

4.9.3.13 RegDLL

DLL檔案 [入口點名稱]

載入指定的 DLL 並且調用 DllRegisterServer (或入口點名稱,當指定之後)。當產生一個錯誤的時候會置一個錯誤標記(例如不能載入 DLL,不能初始化 OLE,不能找到入口點,或者函數返回任何其它錯誤 ERROR_SUCCESS (=0))。

當某些要註冊的 DLL 要依靠其它的位於同目錄或 Windows 目錄下的 DLL 時請用 SetOutPath 來設定目前目錄。例如,如果 foo.dll 依靠位於 $INSTDIR 的 bar.dll 時用e:

 SetOutPath $INSTDIR
 RegDLL $INSTDIR\foo.dll

4.9.3.14 UnRegDLL

DLL檔案

載入指定的 DLL 並且調用 DllUnregisterServer。當產生一個錯誤的時候會置一個錯誤標記(例如不能載入 DLL,不能初始化 OLE,不能找到入口點,或者函數返回任何其它錯誤 ERROR_SUCCESS (=0))。

4.9.4 流程控制指令

4.9.4.1 Abort

[用戶訊息]

取消安裝,停止執行腳本,並且在狀態顯示裡顯示用戶訊息。注意: 你可以用於回調函數來實現一些特殊功能。頁面回調也可以用 Abort 來實現特殊目的。

Abort
Abort "不能安裝"

4.9.4.2 Call

函數名 | :標記名 | 變量(輸入)

調用 函數名 函數或調用 標記名 的標記,或者包含位置的一個變量。位置值可以由 GetCurrentAddress, GetFunctionAddressGetLabelAddress 返回。當使用了 Return 指令後調用將返回。區段和函數可以自動結束於 Return 指令。卸載函數不能由安裝區段或函數調用,反之亦然。

Function func
  Call :label
  DetailPrint "#1: This will only appear 1 time."
label:
  DetailPrint "#2: This will appear before and after message #1."
  Call :.global_label
FunctionEnd

Section
  Call func
  Return

.global_label:
  DetailPrint "#3: The global label was called"
SectionEnd

4.9.4.3 ClearErrors

清除錯誤位標記。

ClearErrors
IfErrors 0 +2
  MessageBox MB_OK "this message box will never show"

4.9.4.4 GetCurrentAddress

用戶變量(輸出)

取得目前指令的位置 (GetCurrentAddress) 並且把它儲存到用戶輸出變量。該用戶變量可以傳遞到 Call 或 Goto。

Function func
  DetailPrint "function"
  IntOp $0 $0 + 2
  Call $0
  DetailPrint "function end"
FunctionEnd

Section
  DetailPrint "section"
  DetailPrint "section"
  GetCurrentAddress $0
  Goto callFunc

  DetailPrint "back to section"
  Return

callFunc:
  Call func
  DetailPrint "section end"
SectionEnd

4.9.4.5 GetFunctionAddress

用戶變量(輸出) 函數名

取得函數位置並且把它儲存到用戶輸出變量。該用戶變量可以傳遞到 Call 或 Goto。注意如果你 Goto 一個由 GetFunctionAddress 輸出的位置,你的函數將不能返回(當你 Goto 的函數要返回時,你應該立即返回)。

Function func
  DetailPrint "function"
FunctionEnd

Section
  GetFunctionAddress $0 func
  Call $0
SectionEnd

4.9.4.6 GetLabelAddress

用戶變量(輸出) 標記

取得標記位置並且把它儲存到用戶輸出變量。該用戶變量可以傳遞到 Call 或 Goto。需要注意的是你可能僅能從你的函數里隨標記調用該指令,但是你可以從任何地方調用它 (可能存在不穩定因素)。需要注意的是如果你調用(Call)了 GetLabelAddress 的輸出,那麼直到它返回時才會被執行 (明確或隱含在一個函數的結尾),然後你將回到 Call 指令的狀態。.

label:
DetailPrint "label"
GetLabelAddress $0 label
IntOp $0 $0 + 4
Goto $0
DetailPrint "done"

4.9.4.7 Goto

要跳轉的標記 | +偏移| -偏移| 用戶變量(目標位置)

如果指定了標記,則轉移到 「要跳轉的標記:」。

如果指定了 +偏移 或 -偏移 ,跳轉會根據偏移指令相對的跳轉。Goto +1 轉移到下一條指令,Goto -1 轉移到上一條指令,等等。

如果指定了用戶變量,則轉移到絕對位置(通常你可以從一個函數比如 GetLabelAddress 來取得該值)。編譯器標記命令和 SectionIn 不是指令所以跳轉對它們無效。

Goto label
Goto +2
Goto -2
Goto $0

4.9.4.8 IfAbort

登出時要跳轉的標記 [不是登出時要跳轉的標記]

如果調用登出時它將返回 true。這種情況可能發生在當一個檔案不能建立(或覆蓋)失敗而用戶選擇登出時或者當用戶手動登出時。該函數僅能在 instfiles 頁面的離開函數里調用。

Page instfiles "" "" instfilesLeave

Function instfilesLeave
  IfAbort 0 +2
    MessageBox MB_OK "user aborted"
FunctionEnd

4.9.4.9 IfErrors

錯誤時跳轉的標記 [沒有錯誤時跳轉的標記]

檢測並清除錯誤標記,如果設了錯誤標記,則轉移到 「錯誤時跳轉的標記」,否則轉移到 「沒有錯誤時跳轉的標記」。錯誤標記由其它指令在產生一個錯誤是設定的(比如試圖去刪除一個正在使用的檔案)。

ClearErrors
File file.dat
IfErrors 0 +2
  Call ErrorHandler

4.9.4.10 IfFileExists

要檢測的檔案 檔案存在時跳轉的標記 [檔案不存在時跳轉的標記]

檢測「要檢測的檔案」是否存在(可以用通配符,或目錄),並當檔案存在時轉移到「檔案存在時跳轉」,否則轉移到「檔案不存在時跳轉」。如果你要檢測目標是檔案還是目錄請使用 IfFileExists 目錄\*.*

IfFileExists $WINDIR\notepad.exe 0 +2
  MessageBox MB_OK "notepad is installed"

4.9.4.11 IfRebootFlag

已設時跳轉的標記 [未設時跳轉的標記]

至少需要一個參數。檢測重啟標記,如果設定了重啟標記則轉移到「已設時跳轉」,否則轉移到「未設時跳轉」。重啟標記可以在 Delete 河 Rename,或手動設定的 SetRebootFlag 指令裡設定。

IfRebootFlag 0 noreboot
  MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" IDNO noreboot
    Reboot
noreboot:

4.9.4.12 IfSilent

靜默安裝時跳轉的標記 [非靜默安裝時跳轉的標記]

至少需要一個參數。檢測靜默安裝標記,如果安裝程式是靜默安裝時轉移到「靜默安裝時跳轉」,否則轉移到「非靜默安裝時跳轉」。靜默安裝標記可以由 SilentInstallSilentUninstallSetSilent 和用戶使用 /S 命令行啟動來設定。

IfSilent +2
  ExecWait '"$INSTDIR\nonsilentprogram.exe"'

4.9.4.13 IntCmp

值1 值2 相等時跳轉的標記 [值1小時跳轉的標記] [值1大時跳轉的標記]

比較兩個整數 值1 和 值2。如果 值1 和 值2 相等,則轉移到「相等時跳轉的標記」,否則如果 值1 < 值2,轉移到「值1小時跳轉的標記」,否則如果 值1 > 值2 ,轉移到「值1大時跳轉的標記」。

IntCmp $0 5 is5 lessthan5 morethan5
is5:
  DetailPrint "$$0 == 5"
  Goto done
lessthan5:
  DetailPrint "$$0 < 5"
  Goto done
morethan5:
  DetailPrint "$$0 > 5"
  Goto done
done:

4.9.4.14 IntCmpU

值1 值2 相等時跳轉的標記 [值1小時跳轉的標記] [值1大時跳轉的標記]

比較兩個無符號整數 值1 和 值2。如果 值1 和 值2 相等,則轉移到「相等時跳轉的標記」,否則如果 值1 < 值2,轉移到「值1小時跳轉的標記」,否則如果 值1 > 值2 ,轉移到「值1大時跳轉的標記」。比較時作為無符號整數來比較。

4.9.4.15 MessageBox

消息框選項列表 消息框文字 [/SD 返回] [檢測返回值 轉移到標記] [檢測返回值2 轉移到標記2]

顯示一個包含「消息框文字」的消息框。「消息框選項列表」必須為下面的一個或多個,多個使用 | 來隔開(例如 MB_YESNO|MB_ICONSTOP)。

「檢測返回值」可以為 0(或空,或保留關閉),或下列之一:

如果消息框的返回值為「檢測返回值」,則安裝程式執行跳轉。

用 /SD 來指定一個上面列出的返回值當在安裝程式靜默安裝時作為返回值。詳細訊息請觀看 section 4.12

MessageBox MB_OK "簡單消息框"
MessageBox MB_YESNO "真的嗎?" IDYES true IDNO false
true:
  DetailPrint "是真的!"
  Goto next
false:
  DetailPrint "是假的"
next:
MessageBox MB_YESNO "真的嗎?(靜默安裝時預設為是)" /SD IDYES IDNO false2
  DetailPrint "是真的 (或靜默)!"
  Goto next2
false2:
  DetailPrint "是假的"
next2:

4.9.4.16 Return

從一個函數或區段返回。

Function func
  StrCmp $0 "return now" 0 +2
    Return
  # do stuff
FunctionEnd

Section
  Call func
  ;"Return" will return here
SectionEnd

4.9.4.17 Quit

使得安裝程式立即登出。在調用 Quit 後,安裝程式將登出(且沒有回調函數可以運行)。

4.9.4.18 SetErrors

設定錯誤標記。

SetErrors
IfErrors 0 +2
  MessageBox MB_OK "this message box will always show"

4.9.4.19 StrCmp

字串1 字串2 相同時跳轉的標記 [不相同時跳轉的標記]

比較(不區分大小寫)「字串1」和「字串2」。如果兩者相等,轉移到「相同時跳轉的標記」,否則轉移到「不相同時跳轉的標記」。

StrCmp $0 "a string" 0 +3
  DetailPrint '$$0 == "a string"'
  Goto +2
  DeteailPrint '$$0 != "a string"'

4.9.5 檔案指令

4.9.5.1 FileClose

句柄

關閉一個由 FileOpen 開啟的檔案句柄。

4.9.5.2 FileOpen

用戶變量(句柄輸出) 檔案名稱 開啟模式

開啟一個「檔案名稱」的檔案,並且把句柄設定為句柄輸出變量。「開啟模式」 為 r (只讀)、w (寫入,檔案的所有內容將被清除)或 a (附加,保持檔案內容並附加寫入)其中之一。在所有的開啟模式裡,檔案指針都置於檔案開始位置。如果檔案不能被開啟,則句柄輸出變量為空,並放置一個錯誤標記。

如果沒有指定絕對路徑則使用目前路徑。目前路徑由 SetOutPath 設定。如果之前沒有使用 SetOutPath 則目前路徑為 $EXEDIR

FileOpen $0 $INSTDIR\file.dat r
FileClose $0

4.9.5.3 FileRead

句柄 用戶變量(輸出) [最大長度]

讀取一個由 FileOpen 開啟的檔案的字串。該字串一直讀取到新的一行為止(或Enter新行)。或直到讀取到空的字元為止,或者直到讀取的字串滿足了「最大長度」(如果指定了的話)。字串的最大長度被限定在 1024 字元之內。如果讀取到了檔案的結尾卻沒有有效的資料則輸出字串被清除,並放置一個錯誤標記。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.4 FileReadByte

句柄 用戶變量(輸出)

讀取一個由 FileOpen 開啟的檔案的字元。讀取的字元作為一個整數(0-255)儲存在輸出變量裡。如果讀取到了檔案的結尾卻沒有有效的資料則輸出字串被清除,並放置一個錯誤標記。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileReadByte $0 $1
FileReadByte $0 $2
DetailPrint "$1 $2"
FileClose $0
done:

4.9.5.5 FileSeek

句柄 偏移 [模式] [用戶變量(新位置)]

定位一個由 FileOpen 開啟的檔案。如果 「模式」 忽略或指定為 SET,則檔案指針定位到 「偏移」。如果 「模式」 指定為 CUR,則檔案指針向後移動 「偏移」。如果檔案指定為 END,則指針定位到相對於檔案結尾 EOF(End of file)處。如果指定了最後一個參數 「用戶變量(新位置)」,則新檔案位置將儲存在該變量中。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileSeek $0 -5 END
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.6 FileWrite

句柄 字串

寫入一個字串到 FileOpen 開啟的檔案。如果寫入時產生了錯誤,則置一個錯誤標記。

ClearErrors
FileOpen $0 $INSTDIR\file.dat w
IfErrors done
FileWrite $0 "some text"
FileClose $0
done:

4.9.5.7 FileWriteByte

句柄 字串

寫入 「字串」 解釋為整數的值到 FileOpen 開啟的檔案。當然你也可以直接輸入整數值。下面的代碼寫入一個 「Enter/換行」 - 輸入到檔案。

FileWriteByte 檔案句柄 "13" ;Enter,相當於 $\r
FileWriteByte 檔案句柄 "10" ;換行,相當於 $\n

如果寫入時產生了錯誤,則置一個錯誤標記。需要注意的是低字元的整數已經被使用,例如: 寫入 256 和寫入 0 一樣,等等。

4.9.5.8 FindClose

句柄

關閉一個由 FindFirst 開啟的搜尋。

4.9.5.9 FindFirst

用戶變量(句柄輸出) 用戶變量(檔案輸出) 檔案規範

對 「檔案規範」 執行一個搜尋,把第一個尋找到的檔案放置到 「用戶變量(檔案輸出)」。也可以把搜尋的句柄放到 「用戶變量(句柄輸出)」。如果未找到任何檔案,則輸出都被設為空,並且放置一個錯誤標記。比較好的用法是使用 FindNext 和 FindClose。需要注意的是 「用戶變量(檔案輸出)」 不帶有路徑。

FindFirst $0 $1 $INSTDIR\*.txt
loop:
  StrCmp $1 "" done
  DetailPrint $1
  FindNext $0 $1
  Goto loop
done:

4.9.5.10 FindNext

句柄 用戶變量(檔案輸出)

繼續一個由 FindFirst 開始的搜尋。句柄應該為 FindFirst 返回的值。如果搜尋已完成(沒有更多檔案),「用戶變量(檔案輸出)」 將被設為空,並且置一個錯誤標記。需要注意的是 「用戶變量(檔案輸出)」 不帶有路徑。

4.9.6 卸載程式指令

4.9.6.1 WriteUninstaller

[路徑\]可執行檔案名稱.exe

由指定的檔案名稱(路徑為可選項)寫入卸載程式。僅在一個安裝區段或函數里有效,並且你的腳本裡必須有一個卸載區段。也可以參考卸載配置。你可以調用一次或多次來寫入一個或多個卸載程式(副本)。

WriteUninstaller $INSTDIR\uninstaller.exe

4.9.7 混合指令

4.9.7.1 GetErrorLevel

變量(錯誤等級輸出)

返回由 SetErrorLevel 設定的最後錯誤等級或者沒有使用過時返回 -1。

GetErrorLevel $0
IntOp $0 $0 + 1
SetErrorLevel $0

4.9.7.2 GetInstDirError

用戶變量(錯誤輸出)

用於目錄選擇頁面的離開函數。讀取標記設定看 DirVerify leave 是否已使用。可能的值:

0: 無錯誤

1: 無效的安裝目錄

2: 目標驅動器沒有足夠的空間

!include LogicLib.nsh
PageEx directory
  DirVerify leave
  PageCallbacks "" "" dirLeave
PageExEnd

Function dirLeave
  GetInstDirError $0
  ${Switch} $0
    ${Case} 0
      MessageBox MB_OK "valid installation directory"
      ${Break}
    ${Case} 1
      MessageBox MB_OK "invalid installation directory!"
      Abort
      ${Break}
    ${Case} 2
      MessageBox MB_OK "not enough free space!"
      Abort
      ${Break}
  ${EndSwitch}
FunctionEnd

4.9.7.3 InitPluginsDir

初始化插件目錄($PLUGINSDIR)當之前沒有初始化時,可以多次使用。

InitPluginsDir
File /oname=$PLUGINSDIR\image.bmp image.bmp

4.9.7.4 SetErrorLevel

錯誤等級

把安裝程式或卸載程式的錯誤等級設為錯誤等級。更多訊息請觀看 Error Levels

IfRebootFlag 0 +2
  SetErrorLevel 4

4.9.7.5 SetShellVarContext

current|all

設定 $SMPROGRAMS 的內容或其他命令解釋程式目錄。如果設為 current (預設值),則使用目前用戶的命令解釋程式目錄。如果設為 all,則使用所有用戶的命令解釋程式目錄。所有用戶目錄可能不能被所有的作業系統支援。如果所有用戶的目錄找不到則使用目前用戶代替。請考慮一個普通用戶或遊客是否有正確的權限在所有用戶目錄裡操作。僅僅管理員才有完全的權限瀏覽所有用戶目錄。你可以用 UserInfo 來觀看用戶身份。詳細訊息請觀看 Contrib\UserInfo\UserInfo.nsi 例子。

SetShellVarContext current
StrCpy $0 $DESKTOP
SetShellVarContext all
StrCpy $1 $DESKTOP
MessageBox MB_OK $0$\n$1

4.9.7.6 Sleep

休眠時間(單位為毫秒)

在安裝程式裡暫停執行 「休眠時間(單位為毫秒)」 時間。「休眠時間(單位為毫秒)」 可以是一個變量,例如 $0 或一個數字,比如 666。

DetailPrint "正在睡覺...^_^"
Sleep 3000
DetailPrint "返回繼續運行"

4.9.8 字串操作指令

4.9.8.1 StrCpy

用戶變量(目標) 字串 [最大長度] [開始偏移]

字串複製指令。注意 「字串」 可以包含另一個變量,或該用戶變量會被設定(可以用來連接字串等等)。如果指定了 「最大長度」 則限定了要複製字串的最大長度 (如果 「最大長度」 是負數,則會從字串尾部截去 「最大長度」 的絕對值個字元)。如果指定了開始偏移,則字串偏移到該處作為開始(如果「開始偏移」是負數,則會從尾部開始偏移)。

StrCpy $0 "a string"         ;$0 = "a string"
StrCpy $0 "a string" 3       ;$0 = "a s"
StrCpy $0 "a string" -1      ;$0 = "a strin"
StrCpy $0 "a string" "" 2    ;$0 = "string"
StrCpy $0 "a string" "" -3   ;$0 = "ing"
StrCpy $0 "a string" 3 -4    ;$0 = "rin"
;連接字串
StrCpy $0 "字串1"
StrCpy $0 "$0 + 字串2" ;$0 = "字串1 + 字串2"

4.9.8.2 StrLen

用戶變量(長度輸出) 字串

取得字串的長度。

StrLen $0 "123456"            ;$0 = 6

4.9.9 堆棧支援

4.9.9.1 Exch

[用戶變量 | 堆棧索引]

當不指定參數時,交換堆棧頂部的兩個單元。當指定了一個參數並且是一個用戶變量時,交換堆棧頂部的單元和該變量的值。當指定了一個參數並且是正整數時,Exch 將會交換堆棧頂部單元和根據參數從堆棧頂部偏移到指定單元的值。如果堆棧裡沒有足夠的單元來完成交換時,會產生一個致命的錯誤(來幫助你調試你的代碼)。

Push 1
Push 2
Exch
Pop $0 # = 1
Push 1
Push 2
Push 3
Exch 2
Pop $0 # = 1
StrCpy $0 1
Push 2
Exch $0 # = 2
Pop $1 # = 1

4.9.9.2 Pop

用戶變量(輸出)

從堆棧裡彈出一個字串到用戶變量 $x。如果堆棧是空的,則會置一個錯誤標記。

Push 1
Pop $0 # = 1

4.9.9.3 Push

字串

把一個字串壓入堆棧。該字串可隨後從堆棧裡彈出。

Push "a string"

4.9.10 整數支援

4.9.10.1 IntFmt

用戶變量(輸出) 格式 數字字串

用 「格式」 格式格式化 「數字字串」 中的數字,並把輸出設為用戶變量 $x。例如格式化字串包含 "%08X" "%u"。
這個指令其實就是 C++ 裡的 wsprintf 函數,常用的格式為 %x - 十六進制數(小寫)、%X - 十六進制數(大寫) 、%d - 十進制數、%u - 無符號整數、%c 單個字元。

IntFmt $0 "0x%08X" 195948557
IntFmt $0 "%c" 0x41

4.9.10.2 IntOp

用戶變量(輸出) 值1 操作 [值2]

數字運算。操作定義為下列之一:

IntOp $0 1 + 1
IntOp $0 $0 + 1
IntOp $0 $0 << 2
IntOp $0 $0 ~
IntOp $0 $0 & 0xF

4.9.11 重啟指令

4.9.11.1 Reboot

重啟電腦。請小心使用該指令。如果失敗,則 .onRebootFailed 函數會被調用。無論如何該指令都不會返回,就像 Quit

MessageBox MB_YESNO|MB_ICONQUESTION "你希望重啟系統嗎?" IDNO +2
  Reboot

4.9.11.2 SetRebootFlag

true|false

設定重啟標記為 true 或 false。該標記值可以由 IfRebootFlag 讀取並作判斷。

SetRebootFlag true
IfRebootFlag 0 +2
  MessageBox MB_OK "this message box will always show"

4.9.12 安裝記錄指令

4.9.12.1 LogSet

on|off

設定安裝記錄到 $INSTDIR\install.log。在你調用該函數之前 $INSTDIR 必須有一個值否則該指令將無效。需要注意的是在編譯的時候編譯配置檔案(config.h)必須設定 NSIS_CONFIG_LOG (預設未設定)來支援該指令。關於重新編譯 NSIS 的詳細訊息請觀看 構建 NSIS

4.9.12.2 LogText

文字

如果啟用了安裝程式記錄,插入「文字」 文字到記錄檔案。

IfFileExists $WINDIR\notepad.exe 0 +2
  LogText "$$WINDIR\notepad.exe exists"

4.9.13 區段管理

4.9.13.1 SectionSetFlags

區段索引 區段標記

設定區段標記。標記為 32 位整數。第一位(低位)代表該區段目前是否選中,第二位代表該區段是否是一個區段組(請不要修改這裡除非你真的很瞭解),第三位代表該區段是否是一個區段組的結尾(同樣,請不要修改),第四位代表該區段文字是否描黑顯示,第五位代表該區段是否是只讀,第六位代表區段組是否自動展開,第七位代表區段組是部分選定的,第八位是部分選定區段組切換內部使用,第九位是用來反映區段名稱更改。如果指定了超出範圍的區段則會放置一個錯誤的標記。

應用的一個例子請看 one-section.nsi

4.9.13.2 SectionGetFlags

區段索引 用戶變量(輸出)

取得該區段的標記。標記的描述請看上面。如果指定了超出範圍的區段則會放置一個錯誤的標記。

4.9.13.3 SectionSetText

區段索引 區段文字

設定 「區段索引」 區段的描述。如果文字設為 "" 則該區段將會隱藏。如果指定了超出範圍的區段則會置一個錯誤的標記。

4.9.13.4 SectionGetText

區段索引 區段文字

把 「區段索引」 區段的描述儲存在輸出變量。如果區段為隱藏,則儲存的變量為空。如果指定了超出範圍的區段則會置一個錯誤的標記。

4.9.13.5 SectionSetInstTypes

區段索引 安裝類型

設定區段在安裝類型中的預設啟用狀態。需要注意的是區段索引從零開始。「安裝類型」 的每一位都是一個告訴該區段是否屬於這個安裝類型的標記。例如,如果你有 3 個安裝類型並且你希望第一個區段包含在類型 1 和 3,則命令如下:

SectionSetInstTypes 0 5

因為 5 的二進制值為 00000101。如果指定了超出範圍的區段則會放置一個錯誤的標記。

4.9.13.6 SectionGetInstTypes

區段索引 用戶變量(輸出)

取得一個區段的安裝類型標記。如何處理輸出的描述請看上面的關於 SectionSetInstTypes 的解釋。如果指定了超出範圍的區段則會放置一個錯誤的標記。

4.9.13.7 SectionSetSize

區段索引 新大小

設定某個區段的大小。需要注意的是索引從零開始。容量的單位為 KB 且僅支援整數。

4.9.13.8 SectionGetSize

區段索引 用戶變量

取得區段的大小並把值儲存在指定的用戶變量裡。需要注意的是索引從零開始。

4.9.13.9 SetCurInstType

安裝類型索引

設定目前安裝類型。「安裝類型索引」 介於 0 到 31 之間。如果使用了一個超出範圍的安裝類型則會放置一個錯誤標記。

4.9.13.10 GetCurInstType

用戶變量

取得目前的安裝類型並儲存到變量裡。如果選擇了第一個類型,則變量值為 0,如果選擇了第二個類型,則變量值為 1,依次類推。${NSIS_MAX_INST_TYPES} (預設為 32) 的值則意味著選擇了自定義安裝類型。

4.9.13.11 InstTypeSetText

安裝類型索引 文字

設定指定的安裝類型的文字。如果設定的文字為空則移除該安裝類型。通過使用一個以前未使用的 「安裝類型索引」 序號你可以建立一個新的安裝類型。要在新的安裝類型裡新增、刪除區段請看 SectionSetInstTypes。與 SectionIn 不同的是該索引從零開始,這意味著第一個安裝類型索引為 0。

4.9.13.12 InstTypeGetText

安裝類型索引 用戶變量

取得指定的安裝類型的文字。

4.9.14 用戶介面指令

4.9.14.1 BringToFront

使安裝程式視窗可見並把它帶到其它視窗的最前端。如果一個應用程式已經執行且顯示在安裝程式的前面,BringToFront 將把安裝程式帶回到焦點。

近期的 Windows 版本限制了前景視窗的設定。如果在安裝的時候用戶正在運行其他的應用程式,也許會通知該用戶使用一種不同的方式。

4.9.14.2 CreateFont

用戶變量(句柄輸出) 字型名 [高] [寬] [/ITALIC] [/UNDERLINE] [/STRIKE]

建立一個字型並把句柄儲存在用戶變量裡。關於不同參數的更多訊息請看 MSDN 關於 Win32 API 函數 CreateFont()

你可以通過 ^Font 和 ^FontSize LangString 來取得目前使用的字型。

!include WinMessages.nsh
GetDlgItem $$0 $HWNDPARENT 1
CreateFont $1 "Times New Roman" "7" "700" /UNDERLINE
SendMessage $0 ${WM_SETFONT} $1 1

4.9.14.3 DetailPrint

訊息

新增 「訊息」 字串到安裝程式的安裝訊息觀看視窗。

DeteailPrint "this message will show on the installation window"

4.9.14.4 EnableWindow

視窗句柄(HWND) (1|0)

對指定的視窗或控件允許或禁止鼠標和鍵盤輸入。可用的狀態為 0(禁止) 或 1(允許)。

GetDlgItem $0 $HWNDPARENT 1
EnableWindow $0 0
Sleep 1000
EnableWindow $0 1

4.9.14.5 FindWindow

用戶變量(視窗句柄輸出) 視窗類名 [視窗標題] [父視窗句柄] [childafter]

尋找一個視窗。類似於 Win32 FindWindowEx()。由視窗類名來尋找(和/或視窗標題,如果指定的話)。如果指定了 「父視窗句柄」 或 childafter,則尋找會受到限制。如果視窗類名或視窗標題指定為 "",則它們將不能用於尋找。如果視窗未找到,用戶變量將返回 0 值。要實現舊式 FindWindow 行為,請和 SendMessage 一起使用。

FindWindow $0 "#32770" "" $HWNDPARENT
FIndWindow $0 "my window class" "my window title"

4.9.14.6 GetDlgItem

用戶變量(輸出) 視窗句柄 控件ID

在指定的對話框上根據控件ID獲得控件句柄。如果你想獲得安裝程式內部的控件句柄,請先使用 FindWindow 用戶變量(視窗句柄輸出) "#32770" "" $HWNDPARENT 來取得視窗句柄。

GetDlgItem $0 $HWNDPARENT 1 # 下一步、安裝按鈕

4.9.14.7 HideWindow

隱藏安裝程式。

4.9.14.8 IsWindow

視窗句柄 是視窗時跳轉的標記 [不是視窗時跳轉的標記]

如果 「視窗句柄」 是一個視窗,則轉移到 「是視窗時跳轉的標記」,否則轉移到 「不是視窗時跳轉的標記」(如果指定了的話)。

GetDlgItem $0 $HWNDPARENT 1
IsWindow 0 +3
  MessageBox MB_OK "找到視窗"
  Goto +2
  MessageBox MB_OK "無視窗"

4.9.14.9 LockWindow

on|off

LockWindow on 使得主視窗在更改或更新時不會自動重繪。使用了 LockWindow off 之後使得應用了 LockWindow on 的視窗的所有控件可以自動重繪。這可以有效的避免頁面的閃爍,因為現在是一組控件同時重繪而不是一個控件一個控件的重繪。個別的控件在老的電腦上也會閃爍。如果你在區段裡使用了循環,你也可以用來阻止進度條來回閃動。

4.9.14.10 SendMessage

視窗句柄 消息 第一個消息參數 第二個消息參數 [用戶變量(返回值)] [/TIMEOUT=毫秒]

發送消息到 「視窗句柄」。如果指定了一個用戶變量 $x 作為最後一個參數(或在 /TIMEOUT 之前的最後一個參數),SendMessage 的返回值將儲存在該變量裡。需要注意的是當指定 「消息」 時你只能用消息的整數值。如果你需要發送字串請使用 「STR:字串」 作為 「第一個消息參數」 或 「第二個消息參數」。

Include WinMessages.nsh 來獲得所有 Windows 消息定義。

要發送一個字串參數的話,在參數前面加入 STR: ,例如: "STR:一些字串" 。

使用 /TIMEOUT=毫秒 來指定持續時間,單位為毫秒。

!include WinMessages.nsh
FindWindow $0 "Winamp v1.x"
SendMessage $0 ${WM_CLOSE} 0 0

4.9.14.11 SetAutoClose

true|false

取代預設的視窗自動關閉標記(由 AutoCloseWindow 指定,且對於寫在程式為 false)。指定 true 將使得安裝程式在安裝完成時立即關閉視窗,或者 false 來使它需要手動關閉。

4.9.14.12 SetBrandingImage

[/IMGID=對話裡的ID項] [/RESIZETOFIT] 位圖.bmp

把目前位圖作為標誌圖檔顯示。如果沒有指定 IMGID 則使用第一個找到的圖檔控件,或由 AddBrandingImage 建立的圖檔控件。需要注意的是位圖必須預先存在於目前用戶的機器上。可以先使用 File 指令把它釋放。如果指定了 /RESIZETOFIT 則圖檔會自動改變容量到圖檔控件的大小。如果你使用了 AddBrandingImage 你可以得到它的大小,通過編譯你的腳本並察看 AddBrandingImage 的輸出,它會告訴你控件的大小。SetBrandingImage 在 .onInit 或 .onInit 調用的函數里無效。

4.9.14.13 SetDetailsView

show|hide

顯示或隱藏詳細訊息,取決於你使用什麼樣的參數。它可以覆蓋預設的由 ShowInstDetails 設定的詳細訊息察看屬性。

4.9.14.14 SetDetailsPrint

none|listonly|textonly|both|lastused

為命令輸出的狀態訊息設定一個顯示模式。None 為不輸出,listonly 僅在列表框顯示,textonly 僅在狀態條顯示,both 則兩者都顯示(預設)。對於釋放很多小的檔案,推薦使用 textonly(特別在 Win9X 下啟用了平滑捲動)。

SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both

4.9.14.15 SetCtlColors

句柄 [/BRANDING] [文字顏色] [transparent|背景顏色]

對一個靜態控件、編輯控件、按鈕或一個對話框設定一個背景顏色和文字顏色。文字顏色背景顏色 不能使用變量。使用 GetDlgItem 來取得控件的句柄。如果要使得控件透明你可以指定 transparent 作為背景顏色值。你也可以指定 /BRANDING 並帶或不帶文字顏色和背景顏色來使得控件完全灰白(或其他你選擇的顏色)。在 MUI 裡用來顯示標誌牌。

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1006
SetCtlColors $0 0xFF0000 0x00FF00

4.9.14.16 SetSilent

silent | normal

設定安裝程式為靜默模式或普通模式。關於靜默安裝的詳細訊息請看 SilentInstall。僅能在 .onInit 裡使用。

4.9.14.17 ShowWindow

視窗句柄 顯示狀態

設定一個視窗的顯示程度。可用的顯示狀態和 Windows 的 ShowWindow 函數相同。SW_* 常量定義於 Include\WinMessages.nsh

!include WinMessages.nsh
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 ${SW_HIDE}
Sleep 1000
ShowWindow $0 ${SW_SHOW}

4.9.15 多語言指令

4.9.15.1 LoadLanguageFile

語言檔案.nlf

給一個語言表的結構載入一個語言檔案。所有的語言檔案在 Contrib\Language Files

在你插入一個語言檔案後 ${LANG_langfile} 將會被定義為語言 ID(例如: ${LANG_ENGLISH} 將會被定義為 1033)。你可以把它用於 LangStringLicenseLangString、LangDLL 和 VIAddVersionKey

4.9.15.2 LangString

名稱 語言ID 字串

定義一個使用多種語言的字串。這意味著它的值將不同於每個語言。這允許你容易的使你的安裝程式多語言化為不需要再腳本裡使用大量的開關語句。

每一個語言字串都有一個特定的名字和一個用於安裝程式的分配給每一個語言的值。他們可以在腳本裡用於任何運行時字串。要使用一個語言字串你所需要做的就是把 $(LangString_名稱) 插入到你想插入字串的地方。

注意:

使用的例子:

 LangString message ${LANG_ENGLISH} "英語訊息"
 LangString message ${LANG_SIMPCHINESE} "簡體中文訊息"
 LangString message ${LANG_TRADCHINESE} "繁體中文訊息"

 MessageBox MB_OK "已翻譯的訊息: $(message)"

4.9.15.3 LicenseLangString

名稱 語言ID 許可檔案路徑

用法和 LangString 一樣,但它僅從一個文字、RTF 檔案載入字串並且定義一個特別的僅能用於 LicenseData 的 LangString。

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_SIMPCHINESE} license-simpchinese.txt
LicenseLangString license ${LANG_TRADCHINESE} license-tradchinese.txt
LicenseData $(license)

上一頁 | 目錄 | 下一頁