将一个值与多个实例进行比较, 并执行第一个匹配的语句.
Switch SwitchValue { Case CaseValue1: Statements1 Case CaseValue2a, CaseValue2b: Statements2 Default: Statements3 }
如果省略, 将执行第一个计算为 true(非零和非空) 的实例. 否则, 对 SwitchValue 进行一次计算并与每个实例值进行比较, 直到找到匹配为止, 然后执行该实例.
如果没有匹配的实例并且存在 Default, 则执行它.
要检查或比较的值, 取决于 SwitchValue 是否存在.
如果 SwitchValue 和 case 值都是数字或数字字符串, 则进行数值比较. 每个用例值都被单独考虑, 不影响用于其他用例值的比较类型. [v1.1.36+]: 如果任意一个表达式是单引号字符串, 则比较是非数值. 例如, switch v:="00"
匹配 case "00":
或 case 0:
, 但不匹配 case "0":
.
StringCaseSense 控制由 Switch 执行的字符串比较的大小写敏感性.
每个实例最多可以列出 20 个值. 每个值必须是一个表达式, 但可以是一个原义数字, 加引号的字符串或变量. Case 和 Default 必须以冒号(:) 终止.
每个实例的第一个语句可以在 Case 下面, 也可以在同一行, 挨着冒号. 每个实例都隐式地以下一个 Case/Default 或右大括号结束. 与在其他一些语言中找到的 switch 语句不同, 没有隐式的落下直通和不使用 Break(除非用于跳出封闭循环).
由于所有实例都包含在同一个块中, 因此在一个实例中定义的标签可以是另一个案例的 Goto 的目标. 但是, 如果标签位于 Case 或 Default 的正上方, 则它将指向前一个实例的结尾, 而不是下一个实例的开头.
Default 不需要列在最后.
switch 2 { case 1: MsgBox no match case 2: MsgBox match case 3: MsgBox no match }
SwitchValue 参数可以省略, 以执行第一个计算结果为 true 的情况.
str := "the red fox jumps over the lazy brown dog" switch { case InStr(str, "blue"): MsgBox false case InStr(str, "red"): MsgBox true case InStr(str, "green"): MsgBox false }
这是一个有效的热键示例. 在 Input 命令的文档中有一个使用 if-else-if 的功能相同的示例.
~[:: Input, UserInput, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca switch ErrorLevel { case "Max": MsgBox, You entered "%UserInput%", which is the maximum length of text. return case "Timeout": MsgBox, You entered "%UserInput%" at which time the input timed out. return case "NewInput": return default: if InStr(ErrorLevel, "EndKey:") { MsgBox, You entered "%UserInput%" and terminated the input with %ErrorLevel%. return } } switch UserInput { case "btw": Send, {backspace 4}by the way case "otoh": Send, {backspace 5}on the other hand case "fl": Send, {backspace 3}Florida case "ca": Send, {backspace 3}California case "ahk": Run, https://www.autohotkey.com } return