上一頁 | 目錄 | 下一頁

E.5 常用函數庫

E.5.1 介紹

包含檔案:

!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" 指令

E.5.2 字串處理函數

E.5.2.1 Find (需要聲明)

語法:

${Find} 輸出變量 字串 要尋找的字串

注意:
-區分大小寫
-使用了 System 插件

例子:

${Find} $0 "C:\Windows\explorer.exe" "explorer"
; 結果: $0 = 11

E.5.2.2 FindI (需要聲明)

語法:

${FindI} 輸出變量 字串 要尋找的字串

注意:
-不區分大小寫
-使用了 System 插件

例子:

${FindI} $0 "C:\Windows\explorer.exe" "explorer"
; 結果: $0 = 11

E.5.2.3 FindLast (需要聲明)

語法:

${FindLast} 輸出變量 字串 要尋找的字串

注意:
-區分大小寫
-使用了 System 插件

例子:

${FindLast} $0 "C:\Windows\explorer.exe" "w" 
; 結果: $0 = 8

E.5.2.4 FindLastI (需要聲明)

語法:

${FindLastI} 輸出變量 字串 要尋找的字串

注意:
-不區分大小寫
-使用了 System 插件

例子:

${FindLastI} $0 "C:\Windows\explorer.exe" "w" 
; 結果: $0 = 8

E.5.2.5 StrStr

語法:

${StrStr} 輸出變量 字串 要尋找的子字串

注意:
-區分大小寫
-使用了 System 插件

例子:

${StrStr} $0 "C:\Windows\explorer.exe" "Windows" 
; 結果: $0 = Windows\explorer.exe

E.5.2.6 StrStrI

語法:

${StrStrI} 輸出變量 字串 要尋找的子字串

注意:
-區分大小寫
-使用了 System 插件

例子:

${StrStrI} $0 "C:\Windows\explorer.exe" "Windows" 
; 結果: $0 = Windows\explorer.exe

E.5.2.7 StrRStrI

語法:

${StrRStrI} 輸出變量 字串 要尋找的子字串

注意:
-不區分大小寫
-使用了 System 插件

例子:

${StrRStrI} $0 "C:\Windows\explorer.exe" "w" 
; 結果: $0 = ws\explorer.exe

E.5.2.8 TrimLine (需要聲明)

語法:

${TrimLine} 輸出變量 字串

注意:

例子:

StrCpy $0 "aaa$\r$\n" 
${TrimLine} $0
; 結果: $0 = aaa

E.5.2.9 TrimLineEx (需要聲明)

語法:

${TrimLineEx} 輸出變量 字串

注意:

例子:

StrCpy $0 "aaa$\r$\n" 
${TrimLineEx} $0
; 結果: $0 = aaa

E.5.2.10 Replace (需要聲明)

語法:

${Replace} 輸入(輸出)變量 要尋找的字串 要替換的字串

注意:

例子:

StrCpy $0 12345ff89 
${Replace} $0 ff firefox
; 結果: $0 = 12345firefox89

E.5.2.11 ReplaceEx (需要聲明)

語法:

${ReplaceEx} 輸入(輸出)變量 要尋找的字串 要替換的字串 字串開始偏移 替換多少次後返回 是否區分大小寫

注意:
"是否區分大小寫" 參數接受 ${TRUE} 或 ${FALSE}

例子:

StrCpy $0 12345ff89 
${ReplaceEx} $0 ff firefox 0 1 ${FALSE}
; 結果: $0 = 12345firefox89

E.5.2.12 VerCmp (需要聲明)

語法:

${VerCmp} 輸出變量 版本1 版本2

注意:
如果相等返回 0,如果 '版本1' 大於 '版本2' 則返回 1 ,否則返回 -1

例子:

${VerCmp} $0 0.8.5 0.8.3
; 結果: $0 = 1

E.5.2.13 StrCase (需要聲明)

語法:

${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

E.5.2.14 StrToHex (需要聲明)

語法:

${StrToHex} 輸出變量 輸入字串

注意:
使用了 System 插件

例子:

${StrToHex} $0 "a 20 你好"
; 結果: $0 = 6120323020C4E3BAC3

E.5.2.15 TrimRN

語法:

${TrimRN} 輸出(輸出)變量

注意:

例子:

StrCpy $0 "aaa$\r$\n"
; 結果: $0 = aaa

E.5.2.16 ConvertANSIToUTF8 (需要聲明)

語法:

${ConvertANSIToUTF8} 輸出 代碼頁 要轉換的字元

注意:
要使用預設的代碼頁請使用 ${CP_ACP},或者指定一個代碼頁,比如簡體中文 - 936、繁體中文 - 950
使用了 System 插件

例子:

${ConvertANSIToUTF8} $0 936 "中國"
; 結果: $0 的內碼為 E4B8ADE59BBD

E.5.2.17 ConvertUTF8ToANSI (需要聲明)

語法:

${ConvertANSIToUTF8} 輸出 代碼頁 要轉換的字元

注意:
要使用預設的代碼頁請使用 ${CP_ACP},或者指定一個代碼頁,比如簡體中文 - 936、繁體中文 - 950
使用了 System 插件

例子:

 

E.5.3 檔案、磁碟處理函數

E.5.3.1 GetParent (需要聲明)

語法:

${GetParent} 輸出變量 字串

注意:

例子:

${GetParent} $0 "C:\Windows\explorer.exe"
; 結果: $0 = C:\Windows

E.5.3.2 GetChild (需要聲明)

語法:

${GetChild} 輸出變量 字串

注意:

例子:

${GetChild} $0 "C:\Windows\explorer.exe"
; 結果: $0 = explorer.exe

E.5.3.3 GetFileExt (需要聲明)

語法:

${GetFileExt} 輸出變量 字串

注意:

例子:

${GetFileExt} $0 "explorer.exe"
; 結果: $0 = exe

E.5.3.4 DumpLog (需要聲明)

語法:

${DumpLog} 要寫入的檔案

注意:
使用了 System 插件

例子:

${DumpLog} "C:\log.txt"

E.5.3.5 AppendFile (需要聲明)

語法:

${AppendFile} 源檔案 目標檔案

注意:

例子:

${AppendFile} "C:\log.txt" "D:\log.txt"

E.5.3.6 DelFileByLog (需要聲明)

語法:

${DelFileByLog} 記錄檔案

注意:

例子:

${DelFileByLog} "$INSDIR\install.log"

E.5.3.7 RMDir (需要聲明)

語法:

${RMDir} 檔案夾

注意:

例子:

${RMDir} $INSTDIR

E.5.3.8 ForEachFile (需要聲明)

語法:

${ForEachFile} 檔案夾 回調函數位置

注意:
在回調函數中,堆棧頂儲存了要處理的檔案全路徑

例子:

GetFunctionAddress $0 CallBackProc
${ForEachFile} $SYSDIR $0 ; 回調函數
Function CallBackProc
Exch $R0
DetailPrint $R0 ;或者其它處理指令
Pop $R0 ;還原 $R0
FunctionEnd

E.5.3.9 ForEachFileEx (需要聲明)

語法:

${ForEachFileEx} 檔案夾 回調函數位置

注意:
在回調函數中,堆棧頂儲存了要處理的檔案全路徑

例子:

GetFunctionAddress $0 CallBackProc
${ForEachFileEx} $SYSDIR $0 ; 回調函數
Function CallBackProc
Exch $R0
DetailPrint $R0 ;或者其它處理指令
Pop $R0 ;還原 $R0
FunctionEnd

E.5.3.10 SearchFile (需要聲明)

語法:

${SearchFile} 尋找結果 檔案夾 檔案

注意:
尋找結果返回找到的第一個匹配檔案全路徑名,找不到時返回空字串。不支援通配符

例子:

${SearchFile} $0 "$WINDIR" "shell32.dll"

E.5.3.11 IsWritable

語法:

${IsWritable} 輸出變量 測試檔案

注意:

例子:

${IsWritable} $0 "$WINDIR\explorer.exe"

E.5.3.12 GetVolume

語法:

${GetVolume} 輸出變量 驅動器名

注意:
使用了 System 插件

例子:

${GetVolume} $0 "C:\"

E.5.3.13 TrimDir

語法:

${TrimDir} 輸入(輸出)變量

注意:

例子:

${TrimDir} $0 "C:\"
; 結果: $0 = C:

E.5.3.14 FileTimeCmp

語法:

${FileTimeCmp} 返回值 檔案1 檔案2

注意:
如果『檔案1』修改時間比『檔案2』早,返回 -1,相等則返回 0,遲則返回 1
使用了 System 插件

例子:

 

E.5.3.15 GetFileSize

語法:

${GetFileSize} 輸出變量 檔案

注意:
如果函數失敗,則返回 ${INVALID_FILE_SIZE}
使用了 System 插件

例子:

${GetFileSize} $0 "$WINDIR\explorer.exe"

E.5.3.16 CompactPathEx

語法:

${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

E.5.3.17 RenameExtension

語法:

${RenameExtension} 輸入(輸出)變量 .副檔名

注意:
使用了 System 插件

例子:

StrCpy $0 "C:\TEST\sample.txt"
${RenameExtension} $0 ".bin"
; 結果: $0 = C:\TEST\sample.bin

E.5.3.18 RelativePathTo

語法:

${RelativePathTo} 輸出變量 參考路徑 要轉換的路徑

注意:
使用了 System 插件

例子:

${RelativePathTo} $0 "c:\a\b\path" "c:\a\x\y\file"
; 結果: $0 = ..\..\x\y\file

E.5.3.19 PathCanonicalize

語法:

${PathCanonicalize} 輸出變量 路徑

注意:
使用了 System 插件

例子:

${PathCanonicalize} $0 "A:\name_1\.\name_2\..\name_3"
; 結果: $0 = A:\name_1\name_3

E.5.3.20 RemoveArgs

語法:

${RemoveArgs} 輸出(輸出)變量

注意:
使用了 System 插件

例子:

StrCpy $0 "c:\a\b\FileA Arg1 Arg2"
${RemoveArgs} $0
; 結果: $0 = c:\a\b\FileA

E.5.3.21 CheckFileEncoding

語法:

${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}

例子:

 

E.5.4 註冊表處理函數

註冊表函數的根鍵的有效值為下列之一
    ${HKCU}
    ${HKLM}
    ${HKU}
    ${HKCR}
    ${HKPD}
    ${HKCC}
    ${HKDD}

E.5.4.1 CopyReg (需要聲明)

語法:

${CopyReg} 源根鍵 源子鍵 目標根鍵 目標子鍵

注意:
使用了 System 插件

例子:

${CopyReg} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"

E.5.4.2 ReadRegBin (需要聲明)

語法:

${ReadRegBin} 輸出變量 根鍵 子鍵 項

注意:
使用了 System 插件

例子:

${ReadRegBin} $0 ${HKLM} `SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop` `Default Taskbar`

E.5.4.3 ReadRegMultiStr (需要聲明)

語法:

${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

E.5.4.4 WriteRegBin (需要聲明)

語法:

${WriteRegBin} 根鍵 子鍵 項 二進制資料(十六進制)

注意:
使用了 System 插件

例子:

${WriteRegBin} ${HKCU} `SOFTWARE\test` ffad61bc00

E.5.4.5 WriteRegStrW (需要聲明)

語法:

${WriteRegStrW} 代碼頁 根鍵 子鍵 項 資料

注意:
Note that Unicode support on Windows Me/98/95 requires Microsoft Layer for Unicode.
在這裡 936 = 簡體中文代碼頁。(950 = 繁體中文代碼頁)
使用了 System 插件

例子:

${WriteRegStrW} 936 ${HKCU} "Software\測試" "簡體中文" "中國"

E.5.4.6 SHCopyKey

語法:

${SHCopyKey} 源根鍵 源子鍵 目標根鍵 目標子鍵

注意:
使用 Shlwapi.dll 的 SHCopyKey 函數。如果函數失敗,則會放置一個錯誤標記
使用了 System 插件

例子:

${SHCopyKey} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"

E.5.4.7 SHRegGetPath

語法:

${SHRegGetPath} 輸出 根鍵 子鍵 值

注意:
使用 Shlwapi.dll 的 SHRegGetPath 函數
使用了 System 插件

例子:

${SHRegGetPath} $0 ${HKCU} "Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Templates"

E.5.4.8 GetRegKeyCount

語法:

${GetRegKeyCount} 輸出 根鍵 子鍵

注意:
使用了 System 插件

例子:

${GetRegKeyCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer"

E.5.4.9 GetRegValueCount

語法:

${GetRegValueCount} 輸出 根鍵 子鍵

注意:
使用了 System 插件

例子:

${GetRegValueCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer\Main"

E.5.5 雜項函數

E.5.5.1 CloseApp

語法:

${CloseApp} 類名

注意:

例子:

${CloseApp} "Winamp v1.x"

E.5.5.2 IsWinNT

語法:

${IsWinNT} 輸出變量

注意:

例子:

${IsWinNT} $0

E.5.5.3 GetComputerName

語法:

${GetComputerName} 輸出變量

注意:

例子:

${GetComputerName} $0

E.5.5.4 GetInstallerName

語法:

${GetInstallerName} 輸出變量

注意:
使用了 System 插件

例子:

${GetInstallerName} $0

E.5.5.5 GetLocaleInfo

語法:

${GetLocaleInfo} 輸出變量 訊息類型

注意:
訊息類型參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_8rse.asp
使用了 System 插件

例子:

 

E.5.5.6 GetWinName

語法:

${GetWinName} 輸出變量

注意:

例子:

${GetWinName} $0 ;$0 = Microsoft Windows ME 等等

E.5.5.7 GetUserName

語法:

${GetUserName} 輸出變量

注意:
使用了 System 插件

例子:

 

E.5.5.8 RefreshIcon

語法:

${RefreshIcon}

注意:
使用了 System 插件

例子:

 

E.5.5.9 ClearDetail

語法:

${ClearDetail}

注意:
使用了 System 插件

例子:

 

E.5.5.10 GetDllVersion

語法:

${GetDllVersion} 輸出變量 DLL

注意:

例子:

 

E.5.5.11 LoadImage

語法:

${LoadImage} 輸出圖檔句柄變量 控件句柄 圖檔名稱和路徑 圖檔類型

注意:
圖檔類型為下列之一:
    ${IMAGE_BITMAP}
    ${IMAGE_CURSOR}
    ${IMAGE_ICON}
使用後應該釋放它佔用的記憶體,調用下列函數
    Bitmap: DeleteObject
    Cursor: DestroyCursor
    Icon: DestroyIcon
使用了 System 插件

例子:

 

E.5.5.12 DeleteObject

語法:

${DeleteObject} 位圖句柄

注意:
使用了 System 插件

例子:

 

E.5.5.13 DestroyCursor

語法:

${DestroyCursor} 光標句柄

注意:
使用了 System 插件

例子:

 

E.5.5.14 DestroyIcon

語法:

${DestroyIcon} 圖檔句柄

注意:
使用了 System 插件

例子:

 

E.5.5.15 MessageBox

語法:

${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 插件

例子:

 

E.5.5.16 WriteEnvStr (需要聲明)

語法:

${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}

E.5.5.17 DeleteEnvStr (需要聲明)

語法:

${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}

上一頁 | 目錄 | 下一頁