包含檔案:
!include "UsefulLib.nsh"
聲明安裝函數 "GetParent" 和卸載函數 "GetParent" (注意: 必須要在使用這個函數之前聲明):
${GetFileExt}
${un.GetParent}
調用函數:
Section Install
${GetParent} "C:\My Downloads\Index.html" $R0
; $R0="C:\My Downloads"
SectionEnd
Section un.Install
${un.GetParent} "C:\My Downloads\Index.html" $R0
; $R0="C:\My Downloads"
SectionEnd
某些簡短的函數可以不用聲明就直接使用,並可以在任意 Section、Function 中使用,卸載區段中也不需要新增 un. 前綴,比如:
Section
${IsWinNT} $0 ;可以直接使用的函數
${If} $0 == 1
DetailPrint "你的系統是 NT、2000 平台"
${Else}
DetailPrint "你的系統是 9X 平台"
${EndIf}
SectionEnd
當函數說明裡註明「使用了 System 插件」而你又在 Function .onInit 裡使用了這個函數 那麼你應該增加 ReserveFile "${NSISDIR}\Plugins\System.dll" 指令
語法:
${Find} 輸出變量 字串 要尋找的字串
注意:
-區分大小寫
-使用了 System 插件
例子:
${Find} $0 "C:\Windows\explorer.exe" "explorer"
; 結果: $0 = 11
語法:
${FindI} 輸出變量 字串 要尋找的字串
注意:
-不區分大小寫
-使用了 System 插件
例子:
${FindI} $0 "C:\Windows\explorer.exe" "explorer"
; 結果: $0 = 11
語法:
${FindLast} 輸出變量 字串 要尋找的字串
注意:
-區分大小寫
-使用了 System 插件
例子:
${FindLast} $0 "C:\Windows\explorer.exe" "w"
; 結果: $0 = 8
語法:
${FindLastI} 輸出變量 字串 要尋找的字串
注意:
-不區分大小寫
-使用了 System 插件
例子:
${FindLastI} $0 "C:\Windows\explorer.exe" "w"
; 結果: $0 = 8
語法:
${StrStr} 輸出變量 字串 要尋找的子字串
注意:
-區分大小寫
-使用了 System 插件
例子:
${StrStr} $0 "C:\Windows\explorer.exe" "Windows"
; 結果: $0 = Windows\explorer.exe
語法:
${StrStrI} 輸出變量 字串 要尋找的子字串
注意:
-區分大小寫
-使用了 System 插件
例子:
${StrStrI} $0 "C:\Windows\explorer.exe" "Windows"
; 結果: $0 = Windows\explorer.exe
語法:
${StrRStrI} 輸出變量 字串 要尋找的子字串
注意:
-不區分大小寫
-使用了 System 插件
例子:
${StrRStrI} $0 "C:\Windows\explorer.exe" "w"
; 結果: $0 = ws\explorer.exe
語法:
${TrimLine} 輸出變量 字串
注意:
例子:
StrCpy $0 "aaa$\r$\n"
${TrimLine} $0
; 結果: $0 = aaa
語法:
${TrimLineEx} 輸出變量 字串
注意:
例子:
StrCpy $0 "aaa$\r$\n"
${TrimLineEx} $0
; 結果: $0 = aaa
語法:
${Replace} 輸入(輸出)變量 要尋找的字串 要替換的字串
注意:
例子:
StrCpy $0 12345ff89
${Replace} $0 ff firefox
; 結果: $0 = 12345firefox89
語法:
${ReplaceEx} 輸入(輸出)變量 要尋找的字串 要替換的字串 字串開始偏移 替換多少次後返回 是否區分大小寫
注意:
"是否區分大小寫" 參數接受 ${TRUE} 或 ${FALSE}
例子:
StrCpy $0 12345ff89
${ReplaceEx} $0 ff firefox 0 1 ${FALSE}
; 結果: $0 = 12345firefox89
語法:
${VerCmp} 輸出變量 版本1 版本2
注意:
如果相等返回 0,如果 '版本1' 大於 '版本2' 則返回 1 ,否則返回 -1
例子:
${VerCmp} $0 0.8.5 0.8.3
; 結果: $0 = 1
語法:
${StrCase} 輸出變量 字串 大小寫類型
注意:
大小寫類型:
- "" = 無轉換
- L = 全部小寫 (this is just an example. a very simple one.)
- U = 全部大寫 (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.)
- T = 單詞首字母大寫 (This Is Just An Example. A Very Simple One.)
- S = 句子首字母大寫 (This is just an example. A very simple one.)
- <> = 切換大小寫 (This is just an example. A very simple one.)
使用了 System 插件
例子:
${StrCase} $0 "This Is Just An Example" U
; 結果: $0 = THIS IS JUST AN EXAMPLE
語法:
${StrToHex} 輸出變量 輸入字串
注意:
使用了 System 插件
例子:
${StrToHex} $0 "a 20 你好"
; 結果: $0 = 6120323020C4E3BAC3
語法:
${TrimRN} 輸出(輸出)變量
注意:
例子:
StrCpy $0 "aaa$\r$\n" ; 結果: $0 = aaa
語法:
${ConvertANSIToUTF8} 輸出 代碼頁 要轉換的字元
注意:
要使用預設的代碼頁請使用 ${CP_ACP},或者指定一個代碼頁,比如簡體中文 - 936、繁體中文 - 950
使用了 System 插件
例子:
${ConvertANSIToUTF8} $0 936 "中國"
; 結果: $0 的內碼為 E4B8ADE59BBD
語法:
${ConvertANSIToUTF8} 輸出 代碼頁 要轉換的字元
注意:
要使用預設的代碼頁請使用 ${CP_ACP},或者指定一個代碼頁,比如簡體中文 - 936、繁體中文 - 950
使用了 System 插件
例子:
語法:
${GetParent} 輸出變量 字串
注意:
例子:
${GetParent} $0 "C:\Windows\explorer.exe"
; 結果: $0 = C:\Windows
語法:
${GetChild} 輸出變量 字串
注意:
例子:
${GetChild} $0 "C:\Windows\explorer.exe"
; 結果: $0 = explorer.exe
語法:
${GetFileExt} 輸出變量 字串
注意:
例子:
${GetFileExt} $0 "explorer.exe"
; 結果: $0 = exe
語法:
${DumpLog} 要寫入的檔案
注意:
使用了 System 插件
例子:
${DumpLog} "C:\log.txt"
語法:
${AppendFile} 源檔案 目標檔案
注意:
例子:
${AppendFile} "C:\log.txt" "D:\log.txt"
語法:
${DelFileByLog} 記錄檔案
注意:
例子:
${DelFileByLog} "$INSDIR\install.log"
語法:
${RMDir} 檔案夾
注意:
例子:
${RMDir} $INSTDIR
語法:
${ForEachFile} 檔案夾 回調函數位置
注意:
在回調函數中,堆棧頂儲存了要處理的檔案全路徑
例子:
GetFunctionAddress $0 CallBackProc
${ForEachFile} $SYSDIR $0 ; 回調函數
Function CallBackProc
Exch $R0
DetailPrint $R0 ;或者其它處理指令
Pop $R0 ;還原 $R0
FunctionEnd
語法:
${ForEachFileEx} 檔案夾 回調函數位置
注意:
在回調函數中,堆棧頂儲存了要處理的檔案全路徑
例子:
GetFunctionAddress $0 CallBackProc
${ForEachFileEx} $SYSDIR $0 ; 回調函數
Function CallBackProc
Exch $R0
DetailPrint $R0 ;或者其它處理指令
Pop $R0 ;還原 $R0
FunctionEnd
語法:
${SearchFile} 尋找結果 檔案夾 檔案
注意:
尋找結果返回找到的第一個匹配檔案全路徑名,找不到時返回空字串。不支援通配符
例子:
${SearchFile} $0 "$WINDIR" "shell32.dll"
語法:
${IsWritable} 輸出變量 測試檔案
注意:
例子:
${IsWritable} $0 "$WINDIR\explorer.exe"
語法:
${GetVolume} 輸出變量 驅動器名
注意:
使用了 System 插件
例子:
${GetVolume} $0 "C:\"
語法:
${TrimDir} 輸入(輸出)變量
注意:
例子:
${TrimDir} $0 "C:\"
; 結果: $0 = C:
語法:
${FileTimeCmp} 返回值 檔案1 檔案2
注意:
如果『檔案1』修改時間比『檔案2』早,返回 -1,相等則返回 0,遲則返回 1
使用了 System 插件
例子:
語法:
${GetFileSize} 輸出變量 檔案
注意:
如果函數失敗,則返回 ${INVALID_FILE_SIZE}
使用了 System 插件
例子:
${GetFileSize} $0 "$WINDIR\explorer.exe"
語法:
${CompactPathEx} 輸出變量 輸入 輸出的最大字元長度
注意:
使用了 System 插件
例子:
${CompactPathEx} $0 "C:\Documents and Settings\會員名稱\Local Settings\Application Data\Microsoft\Internet Explorer" 70
; 結果: $0 = C:\Documents and Settings\會員名稱\Local Settings\...\Internet Explorer
語法:
${RenameExtension} 輸入(輸出)變量 .副檔名
注意:
使用了 System 插件
例子:
StrCpy $0 "C:\TEST\sample.txt"
${RenameExtension} $0 ".bin"
; 結果: $0 = C:\TEST\sample.bin
語法:
${RelativePathTo} 輸出變量 參考路徑 要轉換的路徑
注意:
使用了 System 插件
例子:
${RelativePathTo} $0 "c:\a\b\path" "c:\a\x\y\file"
; 結果: $0 = ..\..\x\y\file
語法:
${PathCanonicalize} 輸出變量 路徑
注意:
使用了 System 插件
例子:
${PathCanonicalize} $0 "A:\name_1\.\name_2\..\name_3"
; 結果: $0 = A:\name_1\name_3
語法:
${RemoveArgs} 輸出(輸出)變量
注意:
使用了 System 插件
例子:
StrCpy $0 "c:\a\b\FileA Arg1 Arg2"
${RemoveArgs} $0
; 結果: $0 = c:\a\b\FileA
語法:
${CheckFileEncoding} 輸出變量 檔案
注意:
返回值為下列值之一
${BOM_ANSI}
${BOM_EBCDIC}
${BOM_UCS4_LE}
${BOM_UCS4_BE}
${BOM_UTF16_BE}
${BOM_UTF16_LE}
${BOM_UNICODE_BE}
${BOM_UNICODE_LE} 或者 ${BOM_UNICODE}
${BOM_UTF8}
例子:
註冊表函數的根鍵的有效值為下列之一
${HKCU}
${HKLM}
${HKU}
${HKCR}
${HKPD}
${HKCC}
${HKDD}
語法:
${CopyReg} 源根鍵 源子鍵 目標根鍵 目標子鍵
注意:
使用了 System 插件
例子:
${CopyReg} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"
語法:
${ReadRegBin} 輸出變量 根鍵 子鍵 項
注意:
使用了 System 插件
例子:
${ReadRegBin} $0 ${HKLM} `SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop` `Default Taskbar`
語法:
${ReadRegMultiStr} 根鍵 子鍵 項 回調函數位置
注意:
在回調函數中堆棧頂儲存了該健的每一個值資料
錯誤等級:
1 不能開啟註冊表健
2 無法搜尋註冊表健
3 是 REG_MULTI_SZ 類型
4 值為空
使用了 System 插件
例子:
Section
GetFunctionAddress $0 CallBackProc
StrCpy $1 0
ClearErrors
${ReadRegMultiStr} ${HKLM} `SYSTEM\CurrentControlSet\Control\Session Manager`\
`ObjectDirectories` $0
${If} ${Errors}
GetErrorLevel $0
DetailPrint $0
${Else}
DetailPrint "回調函數調用了 $1 次"
${EndIf}
SectionEnd
Function CallBackProc
Exch $R0
DetailPrint $R0 ;在回調函數里你可以做其它的處理
IntOp $1 $1 + 1
Pop $R0
FunctionEnd
語法:
${WriteRegBin} 根鍵 子鍵 項 二進制資料(十六進制)
注意:
使用了 System 插件
例子:
${WriteRegBin} ${HKCU} `SOFTWARE\test` ffad61bc00
語法:
${WriteRegStrW} 代碼頁 根鍵 子鍵 項 資料
注意:
Note that Unicode support on Windows Me/98/95 requires Microsoft Layer for Unicode.
在這裡 936 = 簡體中文代碼頁。(950 = 繁體中文代碼頁)
使用了 System 插件
例子:
${WriteRegStrW} 936 ${HKCU} "Software\測試" "簡體中文" "中國"
語法:
${SHCopyKey} 源根鍵 源子鍵 目標根鍵 目標子鍵
注意:
使用 Shlwapi.dll 的 SHCopyKey 函數。如果函數失敗,則會放置一個錯誤標記
使用了 System 插件
例子:
${SHCopyKey} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"
語法:
${SHRegGetPath} 輸出 根鍵 子鍵 值
注意:
使用 Shlwapi.dll 的 SHRegGetPath 函數
使用了 System 插件
例子:
${SHRegGetPath} $0 ${HKCU} "Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Templates"
語法:
${GetRegKeyCount} 輸出 根鍵 子鍵
注意:
使用了 System 插件
例子:
${GetRegKeyCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer"
語法:
${GetRegValueCount} 輸出 根鍵 子鍵
注意:
使用了 System 插件
例子:
${GetRegValueCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer\Main"
語法:
${CloseApp} 類名
注意:
例子:
${CloseApp} "Winamp v1.x"
語法:
${IsWinNT} 輸出變量
注意:
例子:
${IsWinNT} $0
語法:
${GetComputerName} 輸出變量
注意:
例子:
${GetComputerName} $0
語法:
${GetInstallerName} 輸出變量
注意:
使用了 System 插件
例子:
${GetInstallerName} $0
語法:
${GetLocaleInfo} 輸出變量 訊息類型
注意:
訊息類型參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_8rse.asp
使用了 System 插件
例子:
語法:
${GetWinName} 輸出變量
注意:
例子:
${GetWinName} $0 ;$0 = Microsoft Windows ME 等等
語法:
${GetUserName} 輸出變量
注意:
使用了 System 插件
例子:
語法:
${RefreshIcon}
注意:
使用了 System 插件
例子:
語法:
${ClearDetail}
注意:
使用了 System 插件
例子:
語法:
${GetDllVersion} 輸出變量 DLL
注意:
例子:
語法:
${LoadImage} 輸出圖檔句柄變量 控件句柄 圖檔名稱和路徑 圖檔類型
注意:
圖檔類型為下列之一:
${IMAGE_BITMAP}
${IMAGE_CURSOR}
${IMAGE_ICON}
使用後應該釋放它佔用的記憶體,調用下列函數
Bitmap: DeleteObject
Cursor: DestroyCursor
Icon: DestroyIcon
使用了 System 插件
例子:
語法:
${DeleteObject} 位圖句柄
注意:
使用了 System 插件
例子:
語法:
${DestroyCursor} 光標句柄
注意:
使用了 System 插件
例子:
語法:
${DestroyIcon} 圖檔句柄
注意:
使用了 System 插件
例子:
語法:
${MessageBox} 返回值 文字 標題 消息框類型
注意:
消息框類型為下列值之一或聯合
${MB_OK}
${MB_OKCANCEL}
${MB_ABORTRETRYIGNORE}
${MB_YESNOCANCEL}
${MB_YESNO}
${MB_RETRYCANCEL}
${MB_ICONHAND}
${MB_ICONQUESTION}
${MB_ICONEXCLAMATION}
${MB_ICONASTERISK}
${MB_ICONINFORMATION}
${MB_ICONSTOP}
返回值為下列之一
${IDOK}
${IDCANCEL}
${IDABORT}
${IDRETRY}
${IDIGNORE}
${IDYES}
${IDNO}
使用了 System 插件
例子:
語法:
${WriteEnvStr} 變量名 變量值 用戶類型
注意:
用戶類型為下列值之一(僅在 WinNT 平台有效,Win9X 此參數將被忽略)
${CURRENT_USER} - 僅對目前用戶
${LOCAL_MACHINE} - 對本地用戶
${ALL_USERS} - 以上兩項的聯合( ${ALL_USERS} == ${CURRENT_USER} | ${LOCAL_MACHINE} )
Win9X 設定了環境變量後需要重啟才能生效。Win9X 中可能還需要用 GetFullPathName /SHORT 來取得 8.3 格式短路徑名
使用了 System 插件
例子:
${WriteEnvStr} PATH "C:\path" ${ALL_USERS}
語法:
${DeleteEnvStr} 變量名 變量值 用戶類型
注意:
用戶類型為下列值之一(僅在 WinNT 平台有效,Win9X 此參數將被忽略)
${CURRENT_USER} - 僅對目前用戶
${LOCAL_MACHINE} - 對本地用戶
${ALL_USERS} - 以上兩項的聯合( ${ALL_USERS} == ${CURRENT_USER} | ${LOCAL_MACHINE} )
Win9X 設定了環境變量後需要重啟才能生效。Win9X 中可能還需要用 GetFullPathName /SHORT 來取得 8.3 格式短路徑名
使用了 System 插件
例子:
${DeleteEnvStr} PATH "C:\path" ${ALL_USERS}