中文文档 : http://www.jb51.net/shouce/autoit/
一、制作目的和原则
说到自动安装,其目的就是模拟手动操作,自动完成对指定按键的点击和输入指定内容,处理可能出现的情况,最终完成程序的安装 和设置。
也许有人说这样就明白了,用AutoIt里的MouseClick、Send来完成点击和输入,只要抓好点击的坐标就一切搞定了啊!这 当然不能说不是个办法,但做出来的成品可能只能在你自己的电脑上能用,说不定下一次你自己也没法用了。因为每个人的电脑是不一样的,安装窗体在不同分辨率 下的位置也是不一样的,如果用这样做的脚本在别人电脑上操作,就会看到鼠标经过N次狂奔后,打开了M个窗口,却没有点到你要的东西(用来整人倒不错)。
我 们的目的是让脚本能有效的在其他人电脑上运行安装,处理遇到的情况,完成设置或注册等动作,然后结束。所以制作的原则就是通用、精确和可*
1、 尽量少的用鼠标模拟点击的方法,实在用要也要做到保证点击坐标的可*
原因上面都说了,但有时不得已用到点击坐标时怎么办呢,你先想想吧。后面告 诉你我的办法
2、 尽量少用sleep等待语句,而换用其它准确的时间判断语句
有的朋友喜欢用sleep在一个操作后等待一下, 来保证脚本的可*性,其实这却是个不可*的做法。因为每台电脑的性能有所差异,在不同的情况下也有差异,在你的电脑上制作脚本时要停顿5秒的,在一台第旧 的电脑上可能要等待20秒也不一定。AutoIt里是有解决方法的,比如winwaitactive,winwaitclose等,再不行自己写判断啦!
3、 尽量考虑可能出现的情况
有的程序在安装时会提出一些要求,比如需要更新什么文件或进行什么操作,而且未必在每台电脑上安装 时都会出现,这就要我们在做好脚本后多在不同环境测试一下,考虑到一些常见的问题
二、如何学好AutoIt
对于AutoIt我也是个 菜鸟,没有什么经验可谈,但我觉得有三点一定要做到
1、充分利用帮助文件。AutoIt的帮助文件写的非常详细,索引和搜索功能使它在查询上非 常方便,而且每个命令最后都有例子。有什么问题先找它问问。
有的朋友经常说自己英文不好,其实我的也不怎么样,正好利用这个机会学习一下,再说 很多软件在使用时都要用到英文,这方面加强还是有必要的。
2、经常实践。写脚本和编程有几分相似,经常实践,特别在学习新命令时
3、 到AutoIt论坛请教。... 毕竟是AutoIt的官方论坛,高手非常多。全都是英文,大家也练习一下吧。
4、开拓思路,变 换方法。和编程一样,很多问题不一定只有一个解决方法,普通方法解决不了时还可以多试试其它方法。
三、分析一个典型安装脚本
先让我们 来看“极点中文20040813十全大补版”的安装过程
第一步 “欢迎使用 极点中文平台 安装向导”
点击“下一步”——使用快捷键 Alt+N第二步 “使用许可协议”
点击“接受本协议”——使用快捷键Alt+A
点击“下一步”——使用快捷键Alt+N
第三步 “信息”
点击“下一步”——使用快捷键Alt+N
第四步 “选择目标文件夹”
假如默认路径
点击“下一步”——使用快捷 键Alt+N
如果曾经安装过极点,原来的文件夹存在则会出现下面的窗口
点击“是”——使用快捷键Alt+Y
第五步 “选择组件”
假如默认组件
点击“下一步”——使用快捷键Alt+N
第六步 “选择开始菜单文件夹”
假如默认菜单文件 夹
点击“下一步”——使用快捷键Alt+N
第七步 “准备安装”
点击“安装”——使用快捷键Alt+I
等待安装进度
第 八步 “完成”
取消“查看 freewb.chm”和“运行输入法调整工具”前的对勾
——用TAB切换到对应项,再用点击空格进行取 消
点击“完成”——使用快捷键Alt+F
上面的步骤已经非常清楚的告诉我们应该怎样做,下面我们只需要把上面的步骤做成脚本。脚本里我们 需要用到的命令有:
1、Run(“文件名”)——运行与脚本同一目录下的指定文件
2、WinWaitActive(“窗体标题”,”窗 体文本”)——等待指定窗体出现
3、Send(“”)——发送模拟按键。Alt+n用!n表示
1、 WinActive(“窗体标题”,”窗体文本”)——判断指定窗体是否激活
下面是完整的脚本
; ----------------------------------------------------------------------------
; 脚本功能
; 请将下载的"极点中文20040813十全大补版"改名为"JDWB040813.exe"
; 并将其与脚本文件放在同一文件夹下
; ----------------------------------------------------------------------------
run("jdwb040813.exe")
; 运行“jdwb040813.exe”
WinWaitActive("安装 - 极点中文输入平台","安装向导")
;等待窗体"安装 - 极点中文输入平台","安装向导"出现
send("!n")
;发送快捷键Alt+N
WinWaitActive("安装 - 极点中文输入平台","使用许可协议")
send("!a")
;发送快捷键Alt+A
send("!n")
WinWaitActive(" 安装 - 极点中文输入平台","信息")
send("!n")
WinWaitActive("安装 - 极点中文输入平台","选择目标文件夹")
send("!n")
if winactive("目录已存在") Then
;如果窗 体"目录已存在"是激活状态
send("!y")
;发送快捷键Alt+Y
EndIf
WinWaitActive("安装 - 极点中文输入平台","选择组件")
;如果选择其他安装方式请在这里修改
send("!n")
WinWaitActive(" 安装 - 极点中文输入平台","选择开始菜单文件夹")
send("!n")
WinWaitActive("安装 - 极点中文输入平台","准备安装")
send("!i")
;发送快捷键Alt+I
WinWaitActive("安装 - 极点中文输入平台","完成 极点中文输入平台 安装向导")
send("{SPACE}{TAB}{SPACE}{TAB}")
;默认 状态下“查看 freewb.chm”获得焦点,发送空格将勾去掉。
;用TAB切换到下一个复选框
Send("!f")
;发送快 捷键Alt+F
; ----------------------------------------------------------------------------
脚 本中“;”分号开头的部分是注释。
所有这些命令都能在帮助文件里找到具体介绍。
四、从示例脚本考虑几个问题
1、 用Autoit Window Spy精确取得窗体信息
2、 WinWaitActive的使用
3、 Send的使用
4、 修改默认路径(ControlSetText和ControlSend)
5、 修改默认组件
6、 用其它方式按键(ControlClick和MouseClick)
四、从示例脚本考虑几个问题
1、 用Autoit Window Spy精确取得窗体信息
在开始菜单里依次选择“程序—AutoIt V3—Autoit Window Spy”。“Autoit Window Spy”是AutoIt附带的一个获取信息的工具。启动后一般它都在最上面,鼠标激活要查看信息的窗体,“Autoit Window Spy”窗体里将显示激活窗体在鼠标下的信息,如图,这时可以用Ctrl+Alt+F使窗口内容暂停,便于从窗体里复制需要的内容
2、 WinWaitActive的使用
WinWaitActive(“窗体标题”,”窗体文本”)——等待指定窗体出现。使用这个命令,在 AutoIt默认的情况下,窗体标题可以是实际标题的一部分,比如上面的命令也可以用
WinWaitActive("安装","信息")
但 这样在匹配时精确程度也下降了,也可能匹配到另一个标题带“安装”,文本包含“信息”的窗体,所以在使用这个命令时窗体标题尽量用完整标题,最好从 Autoit Window Spy,窗体文本选择当前窗体里有代表性的文本。
3、 Send的使用
Send命令发送模拟按键是输出字 符的首选。它的应用比较灵活
(1) 组合按键:^ 表示Ctrl,! 表示 Alt,+ 表示Shift,#表示 Win
比如上 面完成时Send(“!f”)
(2) 多个Send命令可以合写,一次完成。
(3) Send命令是不能输出中文的,其实Unicode都是不能输出的。
Send命令中有很多特殊按键,请参看帮助文件。
4、 修改默认路径(ControlSetText和ControlSend)
如何"选择目标文件夹"中的默认路径?假如我们不希望它安装在系统盘, 而要安装在“D:Program FilesFreeWB”。
方法一、上面我们已经知道了Send命令的用法,由于路径框这时是激活状态,这里就 可以用到了,Send(“D:Program FilesFreeWB”)
方法二、使用命令ControlSetText ( "窗体标题", "窗体文本", "要设置文字的控件类名或控件精确标题", "需要设置的文字" )
ControlSetText功能是设置窗体里指定控件的文 本,不论窗体或控件这时的状态是否激活。注意ControlSetText是可以输出中文的。
控件类名可以用Autoit Window Spy取得如上图,经查找输入框的类名为“TEdit1”
上面的要求可写命令为
ControlSetText("安装 - 极点中文输入平台","选择目标文件夹","TEdit1"," D:Program FilesFreeWB ")
方法三、使用命令 ControlSend ( "窗体标题", "窗体文本", "接收文字的控件类名或控件精确标题", "需要输入的文字" )
ControlSend 功能和ControlSetText类似,向窗体里指定控件的发送文本,不论窗体或控件这时的状态是否激活。但ControlSend不能输出中文
ControlSend(" 安装 - 极点中文输入平台","选择目标文件夹","TEdit1"," D:Program FilesFreeWB ")
5、 修改默认组件
极点在安装时提供了多种组件组合,如何修改呢?
其实很简单,我们模拟一下使用键盘如何解决就行了。使用键盘TAB将焦点切 换到要修改的控件,再用键盘方法选择,这个方法只用到Send命令就可以完成。推荐使用
6、 用其它方式按键(ControlClick和MouseClick)
上面脚本里遇到按键的地方我们都是用快捷键来完成的,如果没有快捷键应该怎 么办呢?
(1) 从模拟按键的角度思考,如果焦点可以切换到,我们就可以用Tab键切换,用Enter键确认
(2) 使用ControlClick("窗体标题", "窗体文本","要点击的控件类名或控件精确标题")
ControlClick功能是点击指定窗 体里的指定控件,不论窗体或控件这时的状态是否激活。
(3) 使用模拟鼠标点击
这个方法是尽量不要使用的,但有的窗体没有快捷 键,不能切换焦点,又找不到控件信息,这时只能用模拟鼠标点击的方法。
MouseClick(“鼠标左右键”,在屏幕的X位置,在屏幕的Y位置, 点击次数)
使用这一方法必须取得准确的鼠标坐标,而且坐标要适应不同情况,最好用变量取得,具体方法以后再介绍。
总结
在这篇 文章里我不想过多的介绍每一个命令的详细用法,其实一般的安装程序用上面的命令大概就能解决了。主要还是想介绍思路:先考虑使用一般命令和模拟键盘动作, 再考虑复杂命令,最后用相对不精确的模拟鼠标。
学习AutoIT和其它学习一样,多思考,多练习,你一定会学的很好。
1.关于 ctrl+shift+其他键如:ctrl+shift+f 时,建议把shift放在前面。成为:send("+!f")
如果 send("!+f")有事会调出输入法。因为ctrl+shift是各种输入法的切换方式。
2.关于(ControlSetText和 ControlSend)
ControlSend ( "title", "text", "classnameNN", "string" [, flag] )
ControlSetText ( "title", "text", "classnameNN", "new text" )
如:
Controlsend("last","","Edit1","http://autoit.3322.org"& @CRLF)
ControlSetText ( "last", "", "Edit1", "http://autoit.3322.org" )
controlsend 有时是把新的字符串追加到编辑框中,他后面可以带@CRLF,那即在输入后,可以发送一个回车符。
而controlsettext肯定是把新的字 符串替换了原来的数值,且后面不能带@CRLF,带了,也无效。
AutoIt安装脚本技巧篇
;[原创]迷你歌词(MiniLyrics) 2.7.233 安装并写入INI文件进行注册。请版主加精华
;我认为这个安装过程比较典型与实用,看看应该不错。我学autoit时间不长, 望网友指教。
;因为我不喜欢用winamp而用foobar2000,这里我只选支持后者,其他都不支持。
;由于上传图数只有5个,简单 的图就省去几个。
;简单介绍一下以下要用到的函数
;ButtonNN 后面的NN表示控件名编号
;ControlClick ( "窗口标题", "按钮文本描述", "ButtonNN") 相当于用鼠标点击一下,此窗口中的ButtonNN按钮。
;ControlCommand ( "窗口标题", "按钮文本描述", "ButtonNN", "UnCheck", "" )此句作用是不选择此复选框。
;ControlCommand ( "窗口标题", "支按钮文本描述", "ButtonNN", "Check", "" )此句作用是选择此复选框,即打上勾。
;$var=ControlGetText(" 窗口标题", "按钮文本描述", "EditNN")此句的作用是读出文件框EditNN的内容到变量$var。
ControlCommand(" 窗口标题","", "ComboBoxNN","SelectString", '下拉框或列表框内容')
;此句是选择下拉框或列表框的内 容,"SelectString",是表示要选择下拉框中的内容。
:而 'Base'是下
;IniWrite ( "aa.ini", "MiniLyrics", "RegName", "www.crsky.com" )此句的作用是,在ini文件中建立一个设置项,在[MiniLyrics]区下的键值:RegName=www.crsky.com
run("MINILYRICS.EXE")
; 运行程序
WinWaitActive("Installer Language")
ControlClick ( "Installer Language", "OK", "Button1")
;要求选择语言,默认就是简体中文,按OK就行了。
WinWaitActive("MiniLyrics 2.7.233 安装 : 授权条款")
ControlClick ( "MiniLyrics 2.7.233 安装 : 授权条款", "我同意(&I)", "Button2")
;这个简单,与上面类似,授权同意就行了。
WinWaitActive("MiniLyrics 2.7.233 安装: 请选择您想安装的播放器","支持 Winamp2")
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 Winamp2", "Button4", "UnCheck", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 Winamp5", "Button6", "UnCheck", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 Foobar2000", "Button8", "Check", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 RealOne Player", "Button11", "UnCheck", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 Windows Media Player 9.0 (您需要先安装Windows Media Player)", "Button10", "UnCheck", "" )
ControlClick ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "下一步(&N) >", "Button2" )
;这里我只选择支持 foobar2000播放器,设置为选择(即打上勾),其他全不选,
;如想要支持其他播放器,只要把uncheck改为check就可以了。
; 选择后,按下一步就可以了。
WinWaitActive("MiniLyrics 2.7.233 安装: 请选择您想安装的播放器","支持 QCD Player")
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 QCD Player", "Button17", "UnCheck", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 iTunes", "Button13", "UnCheck", "" )
ControlCommand ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "支持 MUSICMATCH Jukebox", "Button15", "UnCheck", "" )
ControlClick ( "MiniLyrics 2.7.233 安装: 请选择您想安装的播放器", "下一步(&N) >", "Button2" )
; 同上
WinWaitActive("MiniLyrics 2.7.233 安装 : 安装选项")
ControlCommand("MiniLyrics 2.7.233 安装 : 安装选项","", "ComboBox1","SelectString", 'Base')
ControlClick ("MiniLyrics 2.7.233 安装 : 安装选项", "下一步(&N) >", "Button2" )
;这里 因为这个软件就是一个插件,我不需要他完全安装,所以只要最基本的base就行了。
;所以在下拉框里选择Base。
WinWaitActive("MiniLyrics 2.7.233 安装 : 安装目录")
Dim $var,$inifile
$var = ControlGetText("MiniLyrics 2.7.233 安装 : 安装目录", "", "Edit1")
ControlClick ( "MiniLyrics 2.7.233 安装 : 安装目录", "安装(&I)", "Button2" )
;这里让你设置安 装目录,我设为默认。只是安装的目录保存到变量$var,作为后面注册用。
WinWaitActive("MiniLyrics 2.7.233 安装 : 完成")
ControlClick ( "MiniLyrics 2.7.233 安装 : 完成", "关闭(&L)", "Button2" )
;这里简单,安装完成,点击关闭按钮就可以了。
$inifile=$var&"/Minilyric.ini"
IniWrite ( $inifile, "MiniLyrics", "RegName", "www.crsky.com" )
IniWrite ( $inifile, "MiniLyrics", "RegCode", "56454DB301GGGF1F" )
;因为这个软件注册是要写入 ini文件的,不想很多软件是写入注册表的。
;而autoit提供了ini文件的操作,通过刚才的变量$var,得到要写入的INI文件。
; 这里的MiniLyrics是ini的区域,即(在文件中用[MiniLyrics])表示的单独一排。
;在安装好后,这个区域是没有的,不过用 iniWrite函数后会自动生成的。
AutoIt技巧-如何处理安装中的中断
更新:最优方法----Adlib函数
安装软件的 过程是由一个个步骤组成的,有时在两个必经步骤中会遇到诸如"文件夹已经存在"的提示,这些提示并非在所有电脑安装时都会出现,我称之为意外中断。如何处 理意外中断是保证脚本稳定性的重要问题,这也是我在AutoIt脚本制作入门里曾提到的要充分考虑各种安装环境。
更新:最优方法 ----Adlib函数
安装软件的过程是由一个个步骤组成的,有时在两个必经步骤中会遇到诸如"文件夹已经存在"的提示,这些提示并非在所有电脑 安装时都会出现,我称之为意外中断。如何处理意外中断是保证脚本稳定性的重要问题,这也是我在AutoIt脚本制作入门里曾提到的要充分考虑各种安装环 境。
意外中断的出现主要是由于安装环境造成的。比如曾经安装过某软件,删除后还保留其目录,再次安装时提示"文件夹已经存在",或者在安装瑞星时 如果电脑上安装了FlashGet或GetRight,就会多一道“是否嵌入”的步骤。再比如联众大厅的安装,在安装完成后会提示“已经集成3721,是 否注册”,这个步骤如果在第二次安装时并不会出现,因为它已经向注册表里添加了相关项。
根据出现原因,我们有两个方法来解决中断。
方法 一、改造安装环境
既然中断出现的原因是由于安装环境不同的,我们可以人为的改造一个固定安装环境。比如“文件夹已经存在”可以在脚本之初判断是否 存在这个文件夹,如果存在就将其删除。再如安装联众大厅的例子,可以在脚本之初删除注册表里有关项。经过上面的改造安装环境后,一些步骤成为“固定”步 骤,就可以当做一般情况,等到窗体出现再做相应判断。
缺点:改造环境虽然能解决问题但,需要注意的事,有些环境是我们希望保留,比如一些个人设置 存在在文件夹里或注册资料保存在注册表的相关项里。在处理这样的情况时不能一概用些方法,否则会造成难以弥补的后果。
方法二、处理中断
这 个问题用语言描述时很简单,“在步骤一和步骤二期间如果出现中断步骤则……”,或者说成“在步骤二出现前如果出现中断则……”。有些朋友没有找到比较好的 方法,因为这个窗体既不是每次都会出现,也不是步骤一后立刻出现。
我们可以用循环来解决这个问题。在步骤一处理后做一个循环,循环中不断判断中断 是否出现,如果出现则进行相应处理,如果一直到步骤二开始中断也没有出现,则跳出循环继续后面的步骤。因为处理完中断后安装自然进行到步骤二,所以没有写 跳出语句,而让其自然跳出。示意步骤如下:
执行步骤一
do
if 中断出现 then
处理中断
endif
until 步骤二出现
执行步骤二
下面针对联众安装时提示“是否注册3721”的中断例子。
使用静态安装参数,在安装完成后,出现登录信息 前如果有出现“3721安装”则否选择“否”。登录信息出现后,关闭登录窗口!
RunWait(@ScriptDir & " oom.exe /silent")
Do
If WinExists("glWorld") then
ControlClick("glWorld","","Button2")
EndIf
Until WinExists("登录信息")
WinClose("登录信息")
更新:最优方法 ----Adlib函数
AutoIt已经给我们提供了一个用于处理错误和弹出窗口的Adlib函数,包括AdlibEnable和 AdlibDisable。它的功能是在主程序运行期间,不断调用处理子程序进行监视,一旦发现符合子程序的执行条件立即执行子程序。其中 AdlibEnable用来启动监视,AdlibDisable用来禁用监视。
AdlibEnable说明 函数格式:
AdlibEnable ( "function" [,time] )
参数说明:
function是子程序的名称。
time为循环调用间隔,默认为250ms,该时间间隔可以修改。
用法及功能:
在脚本运行之初使用(也可在适当时机使用),启动监视子程序。
AdlibDisable说明
函数格式:
AdlibDisable ( )
用法及功能:
一般情况即使不用此函数,待脚本结束后也会自然中止。但有时在有特定要求时,可在适当时机使用此函数中止监视。推荐在脚本最后使用此函数,保持功能的完整 性。
具体实例
仍以联众安装为例可修改脚本如下:
AdlibEnable("KillPopup")
RunWait(@ScriptDir & " Room.exe /silent")
WinExists("登录信息")
WinClose("登录信息")
AdlibDisable()
Func KillPopup()
If WinExists("glWorld") then
ControlClick("glWorld","","Button2")
EndIf
EndFunc
从可*性和稳定性上讲我认 为一般情况下该方法和方法二相当,但毕竟AutoIt已经提供了一个比较好的解决方法,推荐大家使用。