AutoHotkey是一门诞生了十几年的脚本语言,随着时间不断的发展,AHK不仅在热键上做到了可自定义的极致。还在桌面系统、网页、游戏等自动化方面得到了大量爱好者们的扩展运用。其十多年的发展过程中所累积的问题解决方案,能包括你日常所能遇到的绝大部分问题与解决方法。只有你找不到,没它做不到。AHK轻量化免安装免部署的特性使得它成为一个不错的解决问题利器,同时也因为AHK不断做加法和向前兼容,会造成新旧语法同存混乱的问题。
以下就简单解释一下,AHKv1版中,传统命令式语法和函数表达式的语法不同之处和区分方法。避免不必要的困扰
早期时的编程语言标准未成熟,多半都是用的传统文本赋值和命令式语句指令来编写流程,这很不符合现代主流语言的函数表达式编程习惯。所以以下仅指出如何分辨这两种写法的区别,更推荐使用的自然是,以现代表达式编写代码。
一、 变量的传统文本赋值与表达式文本赋值
1.变量的传统文本赋值与if判断(用 = 赋值,if 不加括号以传统式字符串比较判断)
a = 内容a ; --> 在名为 a 的变量中,用 = 赋值字符串 内容a。
if a = 内容a ; --> 判断变量 a 的值是否等于字符串 内容a,如果相同则执行花括号的代码
{ ; --> 以下弹窗显示内容为:"传统命令式显示变量写法:内容a"
MsgBox, 传统命令式显示变量写法:%a%
}
2.变量表达式文本赋值与if判断(用 := 赋值,if 加括号以表达式字符串比较判断)
a := "内容a" ; --> 在名为 a 的变量中,用 := 赋值字符串 内容a。
if (a = "内容a") ; --> 判断变量 a 的值是否等于双引号中的字符串 内容a,如果相同则执行花括号的代码
{ ; --> 以下弹窗,先在开头用 % 转为强制表达式,再显示内容:"表达式显示变量写法:内容a"
MsgBox, % "表达式显示变量写法:" a
}
可以看出以上两个示例效果是等效的,只是写法不同而已。再继续看下一组等效示例进一步解释问题
二、 变量的传统赋值判断与表达式赋值判断
1.变量的传统文本赋值与if 变量判断(用 = 赋值,if 不加括号以传统式进行变量比较判断)
b = 内容b ; --> 在名为 b 的变量中,用 = 赋值字符串 内容b。
c = %b% ; --> 在名为 c 的变量中,用 = 赋值变量 b 的内容。使变量 c 与变量 b 内容相同
if b = %c% ; --> 判断变量 b 的值与变量 c 的值是否相同,如果相同则执行花括号的代码
{ ; --> 以下弹窗传统的混合赋值显示内容为:"变量b:内容b - 变量c:内容b"
MsgBox, 变量b:%b% - 变量c:%c%
}
2.变量表达式文本赋值与if 变量判断(用 := 赋值,if 加括号以表达式进行变量比较判断)
b := "内容b" ; --> 在名为 b 的变量中,用 := 赋值字符串 内容b。
c := b ; --> 在名为 c 的变量中,用 := 赋值变量 b 的内容。使变量 c 与变量 b 内容相同
if (b = c) ; --> 判断变量 b 的值与变量 c 的值是否相同,如果相同则执行花括号的代码
{ ; --> 以下弹窗,先在开头用 % 转为强制表达式,显示内容为:"变量b:内容b - 变量c:内容b"
MsgBox, % "变量b:" b " - 变量c:" c
}
这一组例子可以明显看出,传统赋值和表达式赋值的写法差异。
在2号例子中的MsgBox弹窗上,在开头用 % 转为强制表达式的意义是:只有强制表达式才能进行表达式运算。
正确表达式直接运算示例:MsgBox, % “1+2的计算结果:” 1+2
错误示例:MsgBox, 1+2的计算结果:%1%+%2%
错误原因是:传统命令式因为是默认强制字符串,是无法直接运算的。必须转表达式才能运算。
在AHKv1版中,大部分是以命令式存在的。如:Run、Loop附带的参数、Process等,这些命令中默认强制传统式,需要运算就得开头用 % 转为强制表达式再直接运算。而StrReplace()、if FileExist()、SubStr()等函数式命令,参数都是表达式写法,后面带()的函数式命令只能用表达式书写,无法转为传统式。
以上就是使用AHKv1时,你需要特别注意的事。只要能够区分历史遗留语法问题,你将能用AHK解决很多问题。
更多语法帮助:详见中文帮助文档介绍
https://www.autoahk.com/help/autohotkey/zh-cn/docs/Variables.htm
题外话:AHKv2改成了全函数式语法,但是不再兼容v1。算是另立一个分支吧。因为v2的强语法报错和缺乏函数库积累,使得非程序员用v2解决问题时,缺少参考系和答案。不是很在意语法的同学建议还是用v1来解决问题。
https://www.autoahk.com/archives/9497
我想知道比如:send,{a } ,里面的a怎么可以用变量去在运行时可以动态的修改它,比如 key := a send,{key}
两种写法: key = a send,{%key%} key := “a” send, % “{” key “}”