While
AHK提供三种循环方法,分别是Loop, While和For,其中While和For在其他语言中都很常见,下面通过while循环,实现一个鼠标框选矩形尺寸的脚本
; 来自官网的案例
CoordMode "Mouse", "Screen"
~LButton::
{
    MouseGetPos &begin_x, &begin_y
    while GetKeyState("LButton")
    {
        MouseGetPos &x, &y
        ToolTip begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y)
        Sleep 10
    }
    ToolTip
}
其中,MouseGetPos可以获得鼠标的位置,并将其赋值给begin_x, begin_y。然后,GetKeyState可获取鼠标或键盘的状态,当LButton即鼠标左键处于按压状态时,执行while循环的语句,首先获取当前的x,y坐标,然后弹出一个ToolTip,用于显示鼠标框选出的矩形尺寸,结果如下

相比之下,For循环稍显复杂,用于迭代某个列表,考虑到For循环与可迭代类型息息相关,故而放在后面与可迭代对象一起讲解。
Loop
和While和For相比,最简单的循环方式其实是Loop,在不加参数的情况下,就是一个死循环,如果用Loop改写上面的函数,则内容如下
CoordMode "Mouse", "Screen"
~LButton::
{
    MouseGetPos &begin_x, &begin_y
    Loop
    {
        if not GetKeyState("LButton")
            break
        MouseGetPos &x, &y
        ToolTip begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y)
        Sleep 10
    }
    ToolTip
}
其中,break用于跳出循环,这个关键字不仅适用于Loop循环,也同样适用于其他循环。
带参数的Loop
如果Loop后面跟着不同的参数,则其含义又有不同,根据参数类型,AHK共提供了五种Loop格式,可对文件夹、字符串以及文件进行遍历。
- 数字 表示执行循环的次数
- Loop Files将检索指定的文件夹
- Loop Parse将检索字符串片段
- Loop Read将按行读取文件内容
- Loop Reg检索指定注册表子键的内容,每次一个项目
由于类似Loop 3 这种循环3次的语法相对比较简单,而注册表操作相对来说并不高频,更适合将Loop Reg放在注册表操作中讲解,故而下面主要对Files, Parse, Read这三种Loop循环进行示例说明。
Loop Parse
Loop Parse用于遍历字符串,其参数除了将要被调用的字符串外,还包括另外两个可缺省的参数
- Delimiters用于分割字符串的字符串
- OmitChars字符串在分割之后,在首尾移除的字符
下面用逗号来分割剪贴板中的内容,并逐段输出
CapsLock::{
    Loop Parse, A_Clipboard, ","{
        MsgBox A_LoopField
    }
}
在点击CapsLock后,效果为

Loop Files
Loop Files的完整调用参数为Loop Files FilePattern , Mode,其中FilePattern为支持通配符的路径字符串;Mode可缺省,此时只包括文件且不递归子文件夹,此外可以指定D, F, R三种模式,含义如下
- D 包含文件夹
- F 包含文件
- R 递归到子目录,即对文件夹所有子文件进行遍历。
下面遍历所有.ex结尾的文件
CapsLock::{
FileList := ""
Loop Files, "*.ex"
    MsgBox A_LoopFileName
}
其中,A_LoopFileName表示单次循环时的文件名。
Loop Read
Loop Read用于打开文件并按行遍历,其内置变量A_LoopReadLine即表示某次循环时的某一行
CapsLock::{
    Loop read, "test.ahk"{
        MsgBox A_LoopReadLine
    }
}
效果如下







![Linux学习[19]管线命令详解1---cut, grep, sort, wc, uniq](https://img-blog.csdnimg.cn/19f1fdcb7adc4fd0b8096e8968165879.png)












