当前位置: 首页 > 文档资料 > NSIS 用户手册 >

E.3 Word Functions Header

优质
小牛编辑
124浏览
2023-12-01

E.3.1 介绍

包含头文件:

!include "WordFunc.nsh"

包含函数 "WordFind" 用于安装和 "WordReplace" 用于卸载:

!insertmacro WordFind
!insertmacro un.WordReplace

调用函数:

Section Install
	${WordFind} "A--H---S" "-" "+2" $R0
	; $R0="H"
SectionEnd
Section un.Install
	${un.WordReplace} "A--H---S" "-" "x" "+3*" $R0
	; $R0="A--HxS"
SectionEnd

E.3.2 WordFind

  • 多功能字符串函数
字符串:
"[word+1][delimiter][word+2][delimiter][word+3]..."
"[delimiter][word+1][delimiter][word+2][delimiter]..."
"[delimiter][delimiter][word+1][delimiter][delimiter][delimiter]..."
"...[word-3][delimiter][word-2][delimiter][word-1]"
"...[delimiter][word-2][delimiter][word-1][delimiter]"
"...[delimiter][delimiter][word-1][delimiter][delimiter][delimiter]"

语法:

${WordFind} "[string]" "[delimiter]" "[E][options]" $var
"[string]"         ;[string]
                   ;  输入字符串
"[delimiter]"      ;[delimiter]
                   ;  一个或多个符号
"[E][options]"     ;[options]
                   ;  +number   :从开始起的词语序号
                   ;  -number   :从结尾起的词语序号
                   ;  +number}  :分隔符序号,输出从开始起此分隔符之后的范围
                   ;  +number{  :分隔符序号,输出从开始起此分隔符之前的范围
                   ;  +number}} :词语序号,输出从开始起此词语之后的范围
                   ;  +number{{ :词语序号,输出从开始起此词语之前的范围
                   ;  +number{} :词语序号,输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} :词语序号,带词语输出从开始起此词语之后的范围
                   ;  +number{* :词语序号,带词语输出从开始起此词语之前的范围
                   ;  #         :输出词语总数量
                   ;  *         :输出分隔符总数量
                   ;  /word     :输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到分隔符
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用:+1、-1}、#、*、/word 等...)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

注意:
- 可接受数字 1、01、001...

示例 (通过符号查找词语):

Section
	${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0
	; $R0="Program Files"
SectionEnd

示例 (排除分隔符):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0
	; $R0=" C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (词语总数量):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0
	; $R0="3"
SectionEnd

示例 (分隔符总数量):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0
	; $R0="2"
SectionEnd

示例 (查找词语序号):

Section
	${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0
	; $R0="3"
SectionEnd

示例 ( }} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0
	; $R0=" C:\WINDOWS"
SectionEnd

示例 ( {} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0
	; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

示例 ( *} ):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0
	; $R0="C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (获取父路径):

Section
	StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm"
;	           "C:\Program Files\NSIS\Include\"
;	           "C:\\Program Files\\NSIS\\NSIS.chm"
	${WordFind} "$R0" "\" "-2{*" $R0
	; $R0="C:\Program Files\NSIS"
	;     "C:\\Program Files\\NSIS"
SectionEnd

示例 (坐标):

Section
	${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0
	; $R0="C:\io.sys C"
	IfErrors end
	StrLen $0 $R0             ; $0 = 词语开始位置 (11)
	StrLen $1 ':\lo'          ; $1 = 词语长度 (4)
	; StrCpy $R0 $R1 $1 $0    ; $R0 = :\lo
	end:
SectionEnd

示例 (带错误级别输出):

Section
	${WordFind} "[string]" "[delimiter]" "E[options]" $R0
	IfErrors 0 end
	StrCmp $R0 1 0 +2       ; 错误级别 1?
	MessageBox MB_OK '未找到分隔符!' IDOK end
	StrCmp $R0 2 0 +2       ; 错误级别 2?
	MessageBox MB_OK '没有该词语序号!' IDOK end
	StrCmp $R0 3 0 +2       ; 错误级别 3?
	MessageBox MB_OK '语法错误!'
	end:
SectionEnd

示例 (不带错误级别输出):

Section
	${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0
	; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found)
SectionEnd

示例 (如果找到):

Section
	${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0
	IfErrors notfound found
	found:
	MessageBox MB_OK '找到!' IDOK end
	notfound:
	MessageBox MB_OK '未找到!'
	end:
SectionEnd

示例 (如果找到 2):

Section
	${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0
	StrCmp $R0 "C:\io.sys C:\logo.sys" notfound found        ; error?
	found:
	MessageBox MB_OK '找到!' IDOK end
	notfound:
	MessageBox MB_OK '未找到!'
	end:
SectionEnd

示例 (如果未找到分隔符则接受字符串中的一个词语):

Section
	StrCpy $0 'OneWord'
	StrCpy $1 1
	loop:
	${WordFind} "$0" " " "E+$1" $R0
	IfErrors 0 code
	StrCmp $1$R0 11 0 error
	StrCpy $R0 $0
	goto end
	code:
	; ...
	IntOp $1 $1 + 1
	goto loop
	error:
	StrCpy $1 ''
	StrCpy $R0 ''
	end:
	; $R0="OneWord"
SectionEnd

E.3.3 WordFindS

E.3.4 WordFind2X

  • 查找位于两个分隔符之间的词语。
字符串:
"[delimiter1][word+1][delimiter2][delimiter1][word+2][delimiter2]..."
"[text][delimiter1][text][delimiter1][word+1][delimiter2][text]..."
"...[delimiter1][word-2][delimiter2][delimiter1][word-1][delimiter2]"
"...[text][delimiter1][text][delimiter1][word-1][delimiter2][text]"

语法:

${WordFind2X} "[string]" "[delimiter1]" "[delimiter2]" "[E][options]" $var
"[string]"         ;[string]
                   ;  输入字符串
"[delimiter1]"     ;[delimiter1]
                   ;  第一个分隔符
"[delimiter2]"     ;[delimiter2]
                   ;  第二个分隔符
"[E][options]"     ;[options]
                   ;  +number   :从开始起的词语序号
                   ;  -number   :从结尾起的词语序号
                   ;  +number}} :词语序号,输出从开始起此词语之后的范围
                   ;  +number{{ :词语序号,输出从开始起此词语之前的范围
                   ;  +number{} :词语序号,输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} :词语序号,带词语输出从开始起此词语之后的范围
                   ;  +number{* :词语序号,带词语输出从开始起此词语之前的范围
                   ;  #         :输出词语总数量
                   ;  /word     :输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用:+1、-1、#)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (1):

Section
	${WordFind2X} "[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" "[C:\" "];" "+2" $R0
	; $R0="logo.sys"
SectionEnd

示例 (2):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1" $R0
	; $R0="logo"
SectionEnd

示例 (3):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{{" $R0
	; $R0="C:\WINDOWS C:\io.sys C:"
SectionEnd

示例 (4):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{}" $R0
	; $R0="C:\WINDOWS C:\io.sys C:sys"
SectionEnd

示例 (5):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{*" $R0
	; $R0="C:\WINDOWS C:\io.sys C:\logo."
SectionEnd

示例 (6):

Section
	${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "/logo" $R0
	; $R0="2"
SectionEnd

示例 (带错误级别输出):

Section
	${WordFind2X} "[io.sys];[C:\logo.sys]" "\" "];" "E+1" $R0
	; $R0="1" ("\...];" 未找到)
	IfErrors 0 noerrors
	MessageBox MB_OK '错误级别=$R0' IDOK end
	noerrors:
	MessageBox MB_OK '没有错误!'
	end:
SectionEnd

E.3.5 WordFind2XS

E.3.6 WordFind3X

  • 查找位于两个分隔符之间包含一个字符串的词语

语法:

${WordFind3X} "[string]" "[delimiter1]" "[center]" "[delimiter2]" "[E][options]" $var
"[string]"         ;[string]
                   ;  输入字符串
"[delimiter1]"     ;[delimiter1]
                   ;  第一个字符串
"[center]"         ;[center]
                   ;  中间字符串
"[delimiter2]"     ;[delimiter2]
                   ;  第二个字符串
"[E][options]"     ;[options]
                   ;  +number   :从开始起的词语序号
                   ;  -number   :从结尾起的词语序号
                   ;  +number}} :词语序号,输出从开始起此词语之后的范围
                   ;  +number{{ :词语序号,输出从开始起此词语之前的范围
                   ;  +number{} :词语序号,输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} :词语序号,带词语输出从开始起此词语之后的范围
                   ;  +number{* :词语序号,带词语输出从开始起此词语之前的范围
                   ;  #         :输出词语总数量
                   ;  /word     :输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用:+1、-1、#)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (1):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "+1" $R0
	; $R0="1.AAB"
SectionEnd

示例 (2):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1" $R0
	; $R0="2.BAA"
SectionEnd

示例 (3):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{{" $R0
	; $R0="[1.AAB];"
SectionEnd

示例 (4):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{}" $R0
	; $R0="[1.AAB];[3.BBB];"
SectionEnd

示例 (5):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{*" $R0
	; $R0="[1.AAB];[2.BAA];"
SectionEnd

示例 (6):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "/2.BAA" $R0
	; $R0="2"
SectionEnd

示例 (带错误级别输出):

Section
	${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "XX" "];" "E+1" $R0
	; $R0="1" ("[...XX...];" not found)
	IfErrors 0 noerrors
	MessageBox MB_OK '错误级别=$R0' IDOK end
	noerrors:
	MessageBox MB_OK '没有错误!'
	end:
SectionEnd

E.3.7 WordFind3XS

E.3.8 WordReplace

  • 从字符串中替换或删除词语

语法:

${WordReplace} "[string]" "[word1]" "[word2]" "[E][options]" $var
"[string]"         ;[string]
                   ;  输入字符串
"[word1]"          ;[word1]
                   ;  要删除或替换的词语
"[word2]"          ;[word2]
                   ;  被替换的字符串 (如果为空则删除)
"[E][options]"     ;[options]
                   ;  +number  :从开始起的词语序号
                   ;  -number  :从结尾起的词语序号
                   ;  +number* :从开始起的词语序号,多次替换
                   ;  -number* :从结尾起的词语序号,多次替换
                   ;  +        :替换或删除所有找到的字符串
                   ;  +*       :多次替换所有找到的字符串
                   ;  {}       :如果存在则从两端替换或删除所有分隔符 (无错误级别输出)
                   ;  {}*      :如果存在则从两端多次替换所有分隔符 (无错误级别输出)
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  没有找到要删除或替换的词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用:+1、-1、+1*、-1*、+、+*、{}、{}*)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (替换):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "bmp" "+2" $R0
	; $R0="C:\io.sys C:\logo.bmp C:\WINDOWS"
SectionEnd

示例 (删除):

Section
	${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "" "+" $R0
	; $R0="C:\io. C:\logo. C:\WINDOWS"
SectionEnd

示例 (多次替换 1):

Section
	${WordReplace} "C:\io.sys      C:\logo.sys   C:\WINDOWS" " " " " "+1*" $R0
	; +1* 或 +2* 或 +3* 或 +4* 或 +5* 或 +6*
	; $R0="C:\io.sys C:\logo.sys   C:\WINDOWS"
SectionEnd

示例 (多次替换 2):

Section
	${WordReplace} "C:\io.sys C:\logo.sysSYSsys C:\WINDOWS" "sys" "bmp" "+*" $R0
	; $R0="C:\io.bmp C:\logo.bmp C:\WINDOWS"
SectionEnd

示例 (多次替换 3):

Section
	${WordReplace} "sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys" "sys" "|" "{}*" $R0
	; $R0="|C:\io.sys C:\logo.sys C:\WINDOWS|"
SectionEnd

示例 (带错误级别输出):

Section
	${WordReplace} "C:\io.sys C:\logo.sys" "sys" "bmp" "E+3" $R0
	; $R0="2" (没有该词语序号 "+3")
	IfErrors 0 noerrors
	MessageBox MB_OK '错误级别=$R0' IDOK end
	noerrors:
	MessageBox MB_OK '没有错误!'
	end:
SectionEnd

E.3.9 WordReplaceS

E.3.10 WordAdd

  • 从字符串 2 添加词语 (如果不存在) 到字符串 1,或删除词语 (如果存在)

语法:

${WordAdd} "[string1]" "[delimiter]" "[E][options]" $var
"[string1]"          ;[string1]
                     ;  用于添加或删除的字符串
"[delimiter]"        ;[delimiter]
                     ;  一个或多个符号
"[E][options]"       ;[options]
                     ;  +string2 :添加的词语
                     ;  -string2 :删除的词语
                     ;
                     ;[E]
                     ;  带错误级别输出
                     ;  IfErrors:
                     ;     $var=1  分隔符为空
                     ;     $var=3  语法错误 (使用:+text、-text)
                     ;[]
                     ;  无错误级别输出 (默认)
                     ;  如果出现错误则 (结果=输入字符串)
                     ;
$var                 ;输出 (结果)

示例 (添加):

Section
	${WordAdd} "C:\io.sys C:\WINDOWS" " " "+C:\WINDOWS C:\config.sys" $R0
	; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

示例 (删除):

Section
	${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
	; $R0="C:\logo.sys"
SectionEnd

示例 (添加到一个):

Section
	${WordAdd} "C:\io.sys" " " "+C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
	; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

示例 (删除一个):

Section
	${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS" $R0
	; $R0="C:\io.sys C:\logo.sys"
SectionEnd

示例 (没有找到新词语):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" " " "+C:\logo.sys" $R0
	StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
	MessageBox MB_OK "没有找到要添加的新词语!"
SectionEnd

示例 (没有删除词语):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" " " "-C:\config.sys" $R0
	StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
	MessageBox MB_OK "没有找到要删除的词语!"
SectionEnd

示例 (带错误级别输出):

Section
	${WordAdd} "C:\io.sys C:\logo.sys" "" "E-C:\logo.sys" $R0
	; $R0="1" (分隔符为空 "")
	IfErrors 0 noerrors
	MessageBox MB_OK '错误级别=$R0' IDOK end
	noerrors:
	MessageBox MB_OK '没有错误!'
	end:
SectionEnd

E.3.11 WordAddS

  • WordAdd,但是区分大小写。

E.3.12 WordInsert

  • 在字符串中插入词语

语法:

${WordInsert} "[string]" "[delimiter]" "[word]" "[E][options]" $var
"[string]"          ;[string]
                    ;  输入字符串
"[delimiter]"       ;[delimiter]
                    ;  一个或多个符号
"[word]"            ;[word]
                    ;  要插入的词语
"[E][options]"      ;[options]
                    ;  +number  :从开始起的词语序号
                    ;  -number  :从结尾起的词语序号
                    ;
                    ;[E]
                    ;  带错误级别输出
                    ;  IfErrors:
                    ;     $var=1  分隔符为空
                    ;     $var=2  错误的词语序号
                    ;     $var=3  语法错误 (使用:+1、-1)
                    ;[]
                    ;  无错误级别输出 (默认)
                    ;  如果出现错误则 (结果=输入字符串)
                    ;
$var                ;输出 (结果)

示例 (1):

Section
	${WordInsert} "C:\io.sys C:\WINDOWS" " " "C:\logo.sys" "-2" $R0
	; $R0="C:\io.sys C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (2):

Section
	${WordInsert} "C:\io.sys" " " "C:\WINDOWS" "+2" $R0
	; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

示例 (3):

Section
	${WordInsert} "" " " "C:\WINDOWS" "+1" $R0
	; $R0="C:\WINDOWS "
SectionEnd

示例 (带错误级别输出):

Section
	${WordInsert} "C:\io.sys C:\logo.sys" " " "C:\logo.sys" "E+4" $R0
	; $R0="2" (错误的词语序号 "+4")
	IfErrors 0 noerrors
	MessageBox MB_OK '错误级别=$R0' IDOK end
	noerrors:
	MessageBox MB_OK '没有错误!'
	end:
SectionEnd

E.3.13 WordInsertS

E.3.14 StrFilter

  • 转换字符串为大写或小写
  • 设置符号过滤

语法:

${StrFilter} "[string]" "[options]" "[symbols1]" "[symbols2]" $var
"[string]"       ;[string]
                 ;  输入字符串
                 ;
"[options]"      ;[+|-][1|2|3|12|23|31][eng|rus]
                 ;  +   :将字符串转为大写
                 ;  -   :将字符串转为小写
                 ;  1   :仅数字
                 ;  2   :仅字母
                 ;  3   :仅特殊字符
                 ;  12  :仅数字 + 字母
                 ;  23  :仅字母 + 特殊字符
                 ;  31  :仅特殊字符 + 数字
                 ;  eng :英语符号 (默认)
                 ;  rus :俄语符号
                 ;
"[symbols1]"     ;[symbols1]
                 ;  包含符号 (不改变)
                 ;
"[symbols2]"     ;[symbols2]
                 ;  排除符号
                 ;
$var             ;输出 (结果)

注意:
- 语法错误时的错误标志
- 包含和排除同样的符号 = 排除符号

示例 (大写):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
	; $R0="123ABC 456DEF 7890|%#"
SectionEnd

示例 (小写):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
	; $R0="123abc 456dEF 7890|%#"
SectionEnd

示例 (过滤1):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
	; $R0="abcDEF|%"       ;仅字母 + |%
SectionEnd

示例 (过滤2):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
	; $R0="123a 6F 78|%#"  ;仅数字+ 特殊字符 + af - 4590
SectionEnd

示例 (过滤3):

Section
	${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
	; $R0="123AbC4567890"  ;仅数字 + 字母 + b - def
SectionEnd

示例 (过滤4):

Section
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "+12rus" "ä" "ãå" $R0
	; $R0="123ÀÁÂ456ä7890"  ;仅数字 + 字母 + ä - ãå
SectionEnd

示例 (英语+俄语字母):

Section
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2rus" "" "" $R0
	; $R0="ÀÁÂãäå"        ;仅俄语字母
	${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2" "$R0" "" $R0
	; $R0="abcÀÁÂDEFãäå"  ;仅英语字母 + 俄语字母
SectionEnd

示例 (词首大写):

Section
	Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
	Call Capitalize
	Pop $R0
	; $R0="_01-Perpetuous_Dreamer__-__The_Sound_Of_Goodbye_(Orig._Mix).mp3_"
	${WordReplace} "$R0" "_" " " "+*" $R0
	; $R0=" 01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3 "
	${WordReplace} "$R0" " " "" "{}" $R0
	; $R0="01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3"
SectionEnd
Function Capitalize
	Exch $R0
	Push $0
	Push $1
	Push $2
	${StrFilter} '$R0' '-eng' '' '' $R0
	${StrFilter} '$R0' '-rus' '' '' $R0
	StrCpy $0 0
	loop:
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end
	StrCmp $1 ' ' +5
	StrCmp $1 '_' +4
	StrCmp $1 '-' +3
	StrCmp $1 '(' +2
	StrCmp $1 '[' 0 loop
	IntOp $0 $0 + 1
	StrCpy $1 $R0 1 $0
	StrCmp $1 '' end
	${StrFilter} '$1' '+eng' '' '' $1
	${StrFilter} '$1' '+rus' '' '' $1
	StrCpy $2 $R0 $0
	IntOp $0 $0 + 1
	StrCpy $R0 $R0 '' $0
	IntOp $0 $0 - 2
	StrCpy $R0 '$2$1$R0'
	goto loop
	end:
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd

E.3.15 StrFilterS

E.3.16 VersionCompare

  • 比较版本号

语法:

${VersionCompare} "[Version1]" "[Version2]" $var
"[Version1]"        ; 第一个版本
"[Version2]"        ; 第二个版本
$var                ; 结果:
                    ;    $var=0  版本相同
                    ;    $var=1  版本 1 较高
                    ;    $var=2  版本 2 较高

示例:

Section
	${VersionCompare} "1.1.1.9" "1.1.1.01" $R0
	; $R0="1"
SectionEnd

E.3.10 VersionConvert

  • 将版本转换为可用于比较的十进制数

语法:

${VersionConvert} "[Version]" "[CharList]" $var
"[Version]"         ; 版本
                    ;
"[CharList]"        ; 将被数字替换的字符列表
                    ; "abcdefghijklmnopqrstuvwxyz" (默认)
                    ;
$var                ; 结果:转换后的版本

注意:
- 转换后的字母使用点分开
- 如果字符为非数字或者不在列表中,则它会被转换为点

示例1:

Section
	${VersionConvert} "9.0a" "" $R0
	; $R0="9.0.01"
	${VersionConvert} "9.0c" "" $R1
	; $R1="9.0.03"
	${VersionCompare} "$R0" "$R1" $R2
	; $R2="2"   版本 2 较高
SectionEnd

示例2:

Section
	${VersionConvert} "0.15c-9m" "" $R0
	; $R0="0.15.03.9.13"
	${VersionConvert} "0.15c-1n" "" $R1
	; $R1="0.15.03.1.14"
	${VersionCompare} "$R0" "$R1" $R2
	; $R2="1"   版本 1 较高
SectionEnd

示例3:

Section
	${VersionConvert} "0.15c+" "abcdefghijklmnopqrstuvwxyz+" $R0
	; $R0="0.15.0327"
	${VersionConvert} "0.15c" "abcdefghijklmnopqrstuvwxyz+" $R1
	; $R1="0.15.03"
	${VersionCompare} "$R0" "$R1" $R2
	; $R2="1"   版本 1 较高
SectionEnd