zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    JS判断是PC端还是移动端
    js对象转数组
    js获取当前域名、Url、相对路径和参数以及指定参数
    javascript返回上一页的三种写法
    js正则归纳总结
    higtcharts 生成图表个数问题
    js如何处理后台传递过来的Map
    jQuey实现鼠标滑过整行变色
    <display:column>常用属性解释
    <display:table>常用属性解释
  • 原文地址:https://www.cnblogs.com/livewithnorest/p/2752949.html
Copyright © 2011-2022 走看看