AutoIt3简要笔记

学会一门脚本语言对于日常使用操作系统有很大的帮助,如果是跨平台脚本,目前首选python;但是如果只是针对Windows,那么AutoIt是目前最好的选择之一,虽然不如Windows原生支持的VBScript或bat文件那么方便,但是AI3的强大之处在于它是模拟人与GUI交互的过程的自动化脚本语言——换言之,只要人可以手工完成的任务几乎都可以用AI3模拟完成,而不论你想操作的对象是否开放了对应的API。AI3整体语法特征是basic风格的,学习起来很容易上手,而且AI3可以直接调用winapi,与com交互,功能多多,扩展性好,学习的价值还是很大的。缺点是不跨平台,编译速度很慢。最后吐槽一下AI3同时是人工少女的缩写=,=

以下是入门知识的简单总结:

变量:类似VBS,动态变量类型,不区分大小写,用关键字Dim, Local, Global声明,Dim会复用已存在的全局变量。变量必须以$开头。

常量:常量以const关键字声明,初始化可以用Enum关键字。

运算符:复合运算符同C,其他大体类似VB:字符串连接用&,计算幂次用^,不等于是<>,数值和不区分大小写的字符串比较相等用=,区分用==,逻辑运算用AND,OR和NOT。优先级类似于C语言。

常用宏:可以直接获得某些特殊字符串,例如文件所在路径等。这些宏以@开头,可以直接当作字符串在程序中使用。

流程控制:同VB的语法风格。if…then…elseif..then…else…endif;select xxx…case xxx…case else…endselect和swith…case语句(前者用于多变量,后者用于单变量);for..to..step…next;while…wend;do…until…;关键字exitloop(n=1)用于跳出第n层循环

函数:函数以关键字Func声明,以Return返回值,以EndFunc结束。默认是传值,加上关键字byref用来传引用。

注释:分号后面的同行字都是注释。

窗口:AI3直接提供了GUI创建。使用GUIcreate创建新窗口,GUISetState设置窗口风格,GUIGetMsg捕获消息,GUIDelete删除窗口。窗口处理方式有同步和异步两种。异步主要指的是event模式。

例程:

  1. Global Const $GUI_EVENT_CLOSE = -3 ; 窗口关闭消息的值
  2.  
  3. Opt ( "GUIOnEventMode" , 1 ) ; 开启 Event 模式
  4. GUICreate ( " 我的第一个窗口 " ) ; 创建一个居中显示的 GUI 窗口
  5. GUISetOnEvent ($GUI_EVENT_CLOSE, "main" ) ; 注册关闭消息到自定义函数 main 里面进行处理
  6. $Input = GUICtrlCreateInput ( "1111" , 10, 35, 300, 20)
  7. $btn = GUICtrlCreateButton ( " 读取输入框 " , 40, 75, 90, 20)
  8. GUICtrlSetOnEvent ($btn, "main" ) ; 注册按钮点击消息到自定义函数 main 里面进行处理
  9. GUISetState ( @SW_SHOW ) ; 显示一个空白的窗口
  10.  
  11. While 1 ; 死循环,保证脚本不会退出
  12.        GUISetBkColor ( RandomColor () ) ; 修改窗口背景颜色
  13.        Sleep (3000) ; 睡眠 3
  14. WEnd
  15.  
  16. Func main()
  17.        Switch @GUI_CtrlId ; 根据宏 @GUI_CtrlId 来判断消息
  18.               Case $GUI_EVENT_CLOSE
  19.                      Exit
  20.            Case $btn
  21.                      $D = GUICtrlRead ($Input) ; 读取输入框数据
  22.                      MsgBox ( 0 , " 输入框的数据 " , $D)
  23. EndSwitch
  24. EndFunc
  25.  
  26. Func RandomColor ()
  27.        Return "0x" & Hex ( Random (0, 255, 1), 2) & Hex ( Random (0, 255, 1), 2) & Hex ( Random (0, 255, 1), 2)
  28. EndFunc   ; 产生一个随机的 RGB 颜色值

注意第3行开启了event模式,第8行设置回调函数。11-14行是个死循环,每隔3秒改变一次窗口的背景色;16-28时注册的回调函数,用来处理消息循环。26-28用来生成随机的RGB颜色。

GUI创建显然不是AI3的强项,因此这里只是简单提供了对话框窗口的创建方法,和消息循环,消息映射的一些简单实现。这些概念和win32大致相同。

字符串处理:对于脚本语言,字符串处理一般都是原生支持的。AI3压根没有类库,所以必然也是原生支持的。字符串处理大致同VBS,单引号和双引号等价。常用函数:

    Stringlen, stringleft, stringright, stringmid, stringtrimleft, stringtrimright; stringreplace; stringsplit(返回一个序列,同python的split()方法。

    正则表达式:验证使用stringRegExp,验证@error;在stringRegExp的第三个参数中指定2,会返回匹配的数组;使用stringRegExpReplace用来正则替换。

变量转换:类似python,使用Ptr转化为指针,HWND转化为句柄,INT转换为整数,字符串和编码互转:stringtobinary和binarytostring。

数组:AI仍然是旧式的basic风格,因此这里仍然是数组而不是序列。这里不必做太多解释,注意Ubound函数可以用来取得数组的维数,Redim可以用来调整数组的大小(即重新声明)。

注册表读取:因为AI3不是跨平台的,所以有些很深入的操作也被简单集成成为函数了。操作注册表的函数主要有:

    RegRead用来读取键值;RegEnumVal用来读取键名下的所有键值,RegEnumKey用来读取键名下所有子键名称。

    RegWrite用来写入键值;RegDelete用来删除键值。

文件IO:这里的文件指的是普通的文件,不是指文件流(包括设备)。主要包括以下函数:

Ini配置文件:写脚本时最常用到的玩意。主要是Iniread, iniwrite和Inidelete。批量处理一个段使用IniReadSection,获得所有段名使用iniReadSectionNames。

    文本文件:FileOpen、FileClose、FileWrite、FileWriteLine、FileRead、FileReadLine

    二进制文件:函数同文本文件,不过使用了不同的打开模式。

    所有文件:filedelete、removedir、filemove、filecopy

进程管理:进程管理也是脚本最常用的操作之一。AI3内置了常用的相关函数:

ProcessList函数用来枚举所有进程的列表;processwait用来等待进程出现,ProcessWaitClose用来等待进程结束;关闭进程用processclose。更复杂的操作需要调用系统的API来实现。

    运行文件:Run,RunWait,RunAs,RunAsWait,ShellExecute,ShellExcuteWait。含有As的可以以其他用户运行文件,含有wait的会阻塞进程直到该程序结束。以上只能运行可执行文件(EXE \COM 或 PIF),如果是批处理文件(.bat,.vbs),需要在文件路径前加上解释文件的路径。ShellExecute可以执行任意文件。

    窗口管理:winList会返回所有窗口列表(二维数组,句柄和标题);WinWait等待窗口,Winclose关闭窗口,参数可以使用窗口名称或者窗口句柄。窗口自动化操作时AI3的特色,包括以下函数:

        使用send和controlsend函数发送按键,后者用于后台。

        控件控制(多用于自动安装):ControlClick 、 ControlSetText 、 ControlCommand。

    定时器:AdlibRegister 用来注册定时器, AdlibUnRegister 用来释放定时器。同时也可以使用API中的定时器。

    COM调用:类似于Vbs,AI3也可以调用COM接口。使用CreateObject创建对象,然后调用对象的方法即可,大体方法也和vbs没啥区别。错误处理使用ObjEvent注册回调函数。

    DLL调用:主要就是DllOpen,DLLCall和DllClose三个函数。

    结构:AI3不支持结构,所有与C api交互结构数据的方法在于使用几个函数:DllStructCreate 、 DllStructGetData 、 DllStructGetPtr 、 DllStructGetSize 、 DllStructSetData,很容易顾名思义。

    Socket编程:为了方便socket编程,AI3直接封装了winsock的相关接口,主要包括:TCPStartup(),TCPListen,TCPAccept,TCPRecv, TCPSend, TCPshutdown, TCPconnect。

    数据库编程:可以使用类似vbs的方法管理数据库。这条和socket编程一样,都不是AI3的强项,建议还是用python这种强大的脚本语言更适合。这里不再描述。

最后写个小程序,夜里挂迅雷,有时候速度会变得很慢甚至变成0,这时候只要暂停并重新开始速度就上去了。这点可以用AI3来模拟实现,代码如下(不正确,待修改):

#region ;**** 参数创建于 ACNWrapper_GUI ****

#PRE_Outfile_x64=C:\Users\Terran\Desktop\Temp\ThunderControl.exe

#PRE_Res_Fileversion=0.0.0.0

#PRE_Res_Fileversion_AutoIncrement=y

#PRE_Run_Tidy=y

#Obfuscator_Parameters= /sci 1/striponly

#endregion ;**** 参数创建于 ACNWrapper_GUI ****

;Auto pause and restart tasks in thunder every 30min

 

TraySetIcon("D:\Program Files (x86)\Thunder Network\Thunder\Program\SaveAs.exe")

TrayTip("Thunder watcher", "迅雷监控辅助程序已启动", 10, 1)

AutoItSetOption("WinTitleMatchMode", 4)

 

$waitTime = ProcessWait("Thunder.exe", 3000)

If $waitTime = 0 Then _Exit()

TrayTip("Thunder watcher", "迅雷已启动", 10, 1)

Const $timeInternal = 30 * 60 * 1000

While ProcessExists("Thunder.exe")

    $aTitle = _show()

    If $aTitle <> 0 Then

        ;MsgBox(1, "Debug", WinGetTitle($aTitle)

        $result = WinWaitActive($aTitle, 9000)

        If $result = 0 Then _Exit()

        Send("{F9}")

        Sleep(5000)

        Send("{F8}")

        Sleep(5000)

        ;WinSetState($aTitle, "", @SW_HIDE)

        Sleep($timeInternal)

    Else

        MsgBox(1, "警告", "迅雷窗口未激活,即将退出", 5)

        Exit

    EndIf

WEnd

TrayTip("Thunder watcher", "迅雷监控辅助程序已退出", 10, 1)

Exit

 

Func _show()

    Sleep(5000)

    $handle = WinGetHandle("[CLASS:XLUEFrameHostWnd]")

    If @error = 1 Or $handle = "" Then

        MsgBox(1, "警告", "未发现指定窗口", 5)

        Exit

    EndIf

    WinSetState($handle, "", @SW_SHOW)

    WinActivate($handle, "")

    Return $handle

EndFunc ;==>_show

 

Func _Exit()

    MsgBox(1, "出错了~~", "程序即将退出", 5)

    Exit

EndFunc ;==>_Exit

    还有个以前写的小东西,参考了别人的作品。作用是在取消VMvare那么多服务的自启动,转而在需要的时候再启动服务,然后在关闭程序后自动停止那些服务。

    首先设置这几个服务为手头启动。脚本内容:

#RequireAdmin

#Region ;**** 参数创建于 ACNWrapper_GUI ****

#PRE_Icon=D:\Program Files (x86)\VMplayer\vmplayer.exe

#PRE_Outfile=F:\SysBack\win7\vmplayer.exe

#PRE_Outfile_x64=F:\SysBack\win7\vmplayerx64.exe

#PRE_UseX64=n

#PRE_Res_Comment=自动按需开启关闭AI3 VMware服务及网卡资源。

#PRE_Res_Fileversion=V1.00

#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****

TraySetIcon("D:\Program Files (x86)\VMplayer\ico\config.ico")

TrayTip("VMWare", "启动服务"VMware Authorization Service"", 10, 1)

RunWait(@ComSpec & " /c " & "net start VMAuthdService", "", @SW_HIDE)

TrayTip("VMWare", "启动服务"VMware DHCP Service"", 10, 1)

RunWait(@ComSpec & " /c " & "net start VMnetDHCP", "", @SW_HIDE)

TrayTip("VMWare", "启动服务"VMware NAT Service"", 10, 1)

RunWait(@ComSpec & " /c " & 'net start "VMware NAT Service"', "", @SW_HIDE)

TrayTip("VMWare", "启动服务"VMUSBArbService"", 10, 1)

RunWait(@ComSpec & " /c " & "net start VMUSBArbService", "", @SW_HIDE)

TrayTip("VMWare", "启动连接"VMware Network Adapter VMnet1"", 10, 1)

RunWait("devcon.exe enable *vmnetadapter1", "", @SW_HIDE)

TrayTip("VMWare", "启动连接"VMware Network Adapter VMnet8"", 10, 1)

RunWait("devcon.exe enable *vmnetadapter8", "", @SW_HIDE)

TrayTip("VMWare", "", 10, 1)

RunWait("D:\Program Files (x86)\VMplayer\vmplayer.exe")

TrayTip("VMWare", "停止服务"VMware Authorization Service"", 10, 1)

RunWait(@ComSpec & " /c " & "net stop VMAuthdService", "", @SW_HIDE)

TrayTip("VMWare", "停止服务"VMware DHCP Service"", 10, 1)

RunWait(@ComSpec & " /c " & "net stop VMnetDHCP", "", @SW_HIDE)

TrayTip("VMWare", "停止服务"VMware NAT Service"", 10, 1)

RunWait(@ComSpec & " /c " & 'net stop "VMware NAT Service"', "", @SW_HIDE)

TrayTip("VMWare", "停止服务"VMware VMUSBArbService"", 10, 1)

RunWait(@ComSpec & " /c " & "net stop VMUSBArbService", "", @SW_HIDE)

TrayTip("VMWare", "停止连接"VMware Network Adapter VMnet1"", 10, 1)

RunWait("devcon.exe disable *vmnetadapter1", "", @SW_HIDE)

TrayTip("VMWare", "停止连接"VMware Network Adapter VMnet8"", 10, 1)

RunWait("devcon.exe disable *vmnetadapter8", "", @SW_HIDE)

posted @ 2012-11-03 21:02  生无所息  阅读(5641)  评论(0编辑  收藏  举报