关于AutoHotkey的变量

  Snipaste是一款十分强大的截图工具,然而对于我来说TIM(QQ)的截图功能完全够用了,不过Snipaste的取色功能还是蛮实用的,于是决定自己动手写一个取色工具,在Windows上想快速的实现这种功能,我首先想到的就是AutoHotkey,AutoHotkey是一个Windows平台的自动化脚本语言,它封装了许多Windows上的API,可以很方便的实现很多功能,但是奇怪的变量赋值却给不仔细看文档的我留下许多坑,这里来记录总结一下AHK变量的用法。

关于变量

  • AHK没有明确的变量类型,也不需要被声明,所有变量一开始都是空白。
  • 变量名不区分大小写,最长可以到253个字符,可以包含字母、数字和#_@$。
  • 虽然可以存在纯数字的变量名但是明显这样做会很蠢。
  • and、or、not这三个在表达式里是运算符所以不能随便用。

关于存值和取值

给变量赋值有两种方法:(=)和(:=)。

=

(=):这个等于号十分的耿直,你后面给它什么它就是什么,文档里面叫这种赋值的方法做传统方法。例如:

1
2
num = 1 + 2
MsgBox, % num

ahk-var-1.png

没想到吧!1 + 2 就是等于 1 + 2。其实这个(=)是会把用百分号(%)包裹起来的变量无引号字符串赋值给变量,所以1 + 2就被当成了无引号的字符串。

我们再来试试用百分号包裹的变量:

1
2
3
a = 1
num = %a% + 2
MsgBox, % num

ahk-var-1.png

哇!一摸一样耶,我甚至都懒得再截一张图了

:=

(:=):这个冒号等号用起来倒是更像其他大部分编程语言的(=)赋值符号,它会赋值给变量数字带引号的字符串表达式的结果,文档里叫这种赋值的方法做表达式方法

我们再来试一下1 + 2:

1
2
num := 1 + 2
MsgBox, % num

ahk-var-2.png

1 + 2等于3!总算是得到结果了。

那我们试试百分号包裹的变量:

1
2
3
a := 1
num := %a% + 2
MsgBox, % num

ahk-var-3.png

一片空白!因为表达式方法里的变量并不需要百分号(%)包裹,所以这里的%a%会被当成变量名为%a%的变量,然而这个变量并没有值,所以这个变量值就是空,只要表达式里有空值表达式的结果就是空了。和存值一样取值也有分传统方法和表达式方法,传统方法就是用百分号(%)包裹变量名,而表达式方法则不需要。

正确的做法:

1
2
3
a := 1
num := a + 2
MsgBox, % num

ahk-var-2.png

大功告成!

总结

=):

  • 存值的传统方法。
  • 存入无引号的字符串和百分号包裹(%)的变量。
  • 从百分号(%)包裹的变量里取值(取值的传统方法)。
  • 耿直Boy。

:=):

  • 存值的表达式方法。
  • 存入数字带引号的字符串表达式的结果
  • 直接从变量取值(取值的表达式方法)。
  • 表达式里有空值最后会存成空。

还有就是在没有特别声明的情况下,几乎所有的命令的参数都是用的传统方法取值,但是我们可以让传统方法转成表达式方法:

1
2
3
num := 2
MsgBox, %num% ; 传统方法
MsgBox, % num ; 转换成表达式方法

方法就是在参数开头加上百分号和空格(% ),这样参数就是表达式方法取值了。

题外话

当从文档里面找到equal sign operator (=)发现这个操作符是等价与SetEnv这个命令的,emmmm,从命令名上看确实让我想起了批处理里面设置环境变量的set命令。

1
2
3
> set num=1 + 2
> echo %num%
> 1 + 2

当然,这个函数的名字还是有很大的误导的,其实这个函数名是延续了AutoIt v2的命名,但是AHK并没有把变量存在环境里,而是存在内存里。

最后

通过这次算是把=和:=的困惑搞清楚了,然后又写了一个没什么用的取色工具,又水了一篇没什么营养的博客,欢迎指正有错误的地方(如果有人看的话),最后摆出我的蠢作:Eyedropper