Chinaunix首页 | 论坛 | 博客
  • 博客访问: 658134
  • 博文数量: 107
  • 博客积分: 4135
  • 博客等级: 上校
  • 技术积分: 1182
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-06 16:01
文章分类

全部博文(107)

文章存档

2020年(2)

2012年(5)

2011年(6)

2010年(23)

2009年(17)

2008年(35)

2007年(19)

我的朋友

分类:

2010-11-29 14:14:19

一、制作目的和原则
说到自动安装,其目的就是模拟手动操作,自动完成对指定按键的点击和输入指定内容,处理可能出现的情况,最终完成程序的安装和设置。
也许有人说这样就明白了,用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",""& @CRLF)
ControlSetText ( "last", "", "Edit1", "" )
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", "" )此句的作用是,在ini文件中建立一个设置项,在[MiniLyrics]区下的键值:RegName=
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", "" )
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已经提供了一个比较好的解决方法,推荐大家使用。
 
阅读(1378) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~