在本书第2章,第6小节
在介绍InstallRite应用的时候,是以KV2005为例。
在使用InstallRite重打包kv2005时,如果打包后的KV2005用在不同配置的机器上,会反复重启动。对于这样软件,可以制作autoit的脚本。
附:autoit的使用方法
在使用组策略分发软件的时候,或者通过文件夹共享安装软件的时候,有的软件可以自动安装完成,有的软件可以使用install Rite重新打包后也能自动安装完成。这两种操作都不需要用户有太多的参与。但还有一些软件,不能使用install Rite重新打包(如KV2006、驱动程序等),如果单位中用户操作计算机的水平不高,不能自己安装软件,那这种情况下,只能由网管或熟悉计算机的人来安装软件了。
那么,如果想解放网管、减轻网管的负担,对于一些这种操作,就没有办法了吗?我们可以使用AutoIt这个软件、通过制作脚本的方法,实现“全自动化”的安装软件。
AutoIt 是一种自动控制工具。它可以被用来自动完成任何基于 Windows 或 DOS 的简单任务。它最初被设计用来自动完成安装那些其它方法不能自动安装的软件。尽管有一些程序如Office等具有自动安装的功能,可还有太多的程序不具备自动安装的功能。那就是用到 AutoIt 的地方。AutoIt 也可以被用来在你的机器上完成简单的任务。
AutoIt 运行时读取一个指定的脚本文件。这个脚本文件使得 AutoIt 完成一系列操作,包括:
① 执行程序(Windows 应用程序、DOS 命令等等。)
② 发出按键和鼠标点击(所有字符,不受键盘布局约束)。
③ 窗口操作(例如最小化、隐藏、恢复、等待、激活,同样适用于Windows98/2000/XP/2003)。
④ 简单剪贴板文本操作。
AutoIt是一款共享软件,没有任何使用上的限制。AutoIt是通过制作“脚本”的方法,由AutoIt运行脚本来实现相应的功能。就像原来DOS中的批处理、Word中的“宏”一样,它只是按照人们事先制定的脚本、来实现相应的功能。例如,我们有下列的几种操作,可以用AutoIt的脚本来实现:
① 在Windows Server 2003中,需要用户登录后,先禁用“路由和远程访问服务”,然后再启用“路由和远程访问服务”并且对里面进行重新设定,设定之后,再关闭“路由和远程访问服务”的管理窗口。
② 软件安装,如果我们安装KV2006,需要接受许可协议、输入产品安装序列号、之后配置KV2006。
③ 对于管理员来说,打开管理工作站后,需要登录服务器(如使用“远程桌面”登录服务器,需要输入服务器的地址、用户名、密码等)。
对于以上这些操作,我们都可以制作相应的脚本,并且把脚本编译成可执行程序,运行编辑后的可执行程序,可以在其他类似的计算机上进行相应的操作。
从这些可以看出,使用AutoIt制做安装程序,只是它的“一小部分”功能。在此,我们介绍AutoIt的使用方法。
AutoIt的安装非常简单,只要按照默认值即可以安装成功。在AutoIt中有非常详细的使用说明,下面我们通过制作KV2006安装程序的脚本,介绍autoit的使用方法。
首先我们来看图1-262,里面包括了KV2006的安装程序(setup.exe)、为安装KV2006编辑的安装脚本(kv.au3)、已经用AutoIt编译好的安装脚本执行程序(kv.exe,在运行的时候不需要AutoIt程序和kv.au3文件),其中kv.au3已经用“记事本”程序打开,里面是安装脚本的全部内容,如图1-262所示。

图1-262 制作好的脚本
首先看第一行【run(".\setup.exe")】,表示要运行的程序。其中,【.\】为当前目录(因为安装软件的时候,脚本通常和安装程序在同一文件夹,并且使用当前目录可以在网络环境中分发,这是一个很好的使用“相对路径”的例子),【setup.exe】为将要运行的程序名称,在此,KV2006的安装程序是setup.exe。
如果制作的脚本是运行其他的程序,请在此替换为其他程序的名称。
第二行【WinWaitActive("江民杀毒软件KV2006","首创全球领先的BOOTSCAN杀毒技术")】为等待一个窗口出现,窗口的标题名称为“江民杀毒软件KV
第三行【Send("{ENTER}")】为发送回车键,相应于按下回车键。
在以后的脚本中,都是重复第二、第三行,只是等待出现的窗口不同、发送的按键不同罢了,其意义是一样的。
下面我们来看一下,怎样制做这个脚本。
首先用记事本新建一个文本文件,并保存为kv.au3,首先编辑第一行【run(".\setup.exe")】。
然后从“AutoIt v

图1-263 窗口信息程序
然后按“CTRL+ALT+F”热键,暂停“AutoIt Window Info”程序的运行,之后运行KV2006的安装程序,以记录相关的信息。在记录信息的过程中需要注意:
等待安装界面处于静止等待状态(即处于等待按键或单击鼠标或者按热键继续的时候)时,按“CTRL+ALT+F”热键,“AutoIt Window Info”程序将显示当前窗口信息,此时记录当前窗口的标题和里面的关键内容(不同于其他窗口的内容,即关键字)。
如图1-264所示,当安装程序进行第一个等待界面时,按“CTRL+ALT+F”热键,“AutoIt Window Info”窗口将会自动捕获当前活动窗口信息,把鼠标移动到有按钮的窗口上去,然后按“CTRL+ALT+F”,暂停新的捕获,此时可以记录第一个窗口的信息,如图1-264所示。

图1-264 第一个等待窗口
此时,我们可以将第一个活动窗口的标题(江民杀毒软件KV2006,文中的【Title: 江民杀毒软件KV2006】显示)和里面的关键字(如下面的【首创全球领先的BOOTSCAN杀毒技术】)写在脚本的第二行WinWaitActive函数的里面,即:
WinWaitActive("江民杀毒软件KV2006","首创全球领先的BOOTSCAN杀毒技术")
注意,脚本中所有的标点符号都要为英文字符,不能使用中文字符代替。
在出现这一界面后,按回车键进入下一界面,则相应的AutoIt脚本为
Send("{ENTER}")
这一行的意思,就相当于在系统中按下回车键,关于其他按键,将在下面介绍。
后面的两个安装界面,与此类似。
而在输入序列号界面,如图1-265所示。

图1-265 输入序列号界面
此时,先输入序列号试一下。在输入安装序列号的过程中,不需要按“TAB”键到一下输入栏。输入序列号完成后,按回车键进入下一界面,则相应的脚本如下
WinWaitActive("江民杀毒软件KV2006","使用序列号")
Send("kcxx348xx5jb7nj803yfmxxxt")
“Send”的后面,即为产品的安装序列号。假设有其他的安装程序,如果在输入序列号的时候,在输入一组后需要按TAB键到下一组,则相应为
Send("kcxx3{TAB}48xx5{TAB}jb7nj{TAB}803yf{TAB}mxxxt")
后面的安装脚本,也这样编辑。
使用AutoIt的过程中,需要注意:
① 对于KV2006这类主要靠鼠标进行控制的安装程序,在制作脚本有,只能是使用TAB、空格、回车键等先进行安装,并记录下来。而如果有一写快捷键的安装程序,是很容易编写脚本的。例如Acdsee 8的安装程序,如图1-266所示。

图1-266 Acdsee 8安装程序
它的下一个界面的热键是Alt+N,则这一界面的脚本编写如下:
WinWaitActive("ACDSee 8 - InstallShield Wizard"," WARNING: This program")
Send("!n")
② 使用AutoIt制作脚本时,要考虑到多个方面。如上面制作的脚本只是用于第一次安装的KV2006的情况,如果系统中已经安装了KV2004或KV2005,则在运行安装程序的时候,会出现卸载以前版本的程序的界面;如果系统中已经安装了KV2006,则会出现修复的界面。对于这种情况,有两个办法解决,一是另外制作“KV2006卸载程序”和“KV2006修复程序”的脚本,并让用户选择(如果用户安装过KV2006以前的版本,请运行“KV2006卸载程序”;如果原来安装过KV2006,则运行“KV2006修复程序”)。另外的方法是制作带条件判断和转向的脚本以适应多种情况。
下面是制作好的KV2006安装脚本(带卸载功能),内容如下:
run(".\setup.exe")
WinWaitActive("江民杀毒软件KV2006","正在准备安装江民杀毒软件")
Sleep(15000)
$i=0
do
Sleep(1000)
if WinActive("setup","确定") then
WinWaitActive("setup","安装程序发现江民杀毒软件")
WinActivate("setup","安装程序发现江民杀毒软件")
Send("{ENTER}")
WinWaitActive("UnInstall","是否要卸载江民杀毒软件")
WinActivate("UnInstall","是否要卸载江民杀毒软件")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006卸载程序","卸载完成")
WinActivate("江民杀毒软件KV2006卸载程序","卸载完成")
Send("{ENTER}")
$i=1
ExitLoop
endif
Sleep(1000)
if WinActive("江民杀毒软件KV2006","首创全球领先的BOOTSCAN杀毒技术") then
WinWaitActive("江民杀毒软件KV2006","首创全球领先的BOOTSCAN杀毒技术")
WinActivate("江民杀毒软件KV2006","首创全球领先的BOOTSCAN杀毒技术")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","在运行安装程序前退出其它Windows程序")
WinActivate("江民杀毒软件KV2006","在运行安装程序前退出其它Windows程序")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","最终用户软件许可协议")
WinActivate("江民杀毒软件KV2006","最终用户软件许可协议")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","使用序列号")
WinActivate("江民杀毒软件KV2006","使用序列号")
Send("kcxx348xx5jb7nj803yfmxxxt")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","安装")
WinActivate("江民杀毒软件KV2006","安装")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","准备复制")
WinActivate("江民杀毒软件KV2006","准备复制")
Send("{ENTER}")
WinWaitActive("江民杀毒软件KV2006","安装成功")
WinActivate("江民杀毒软件KV2006","安装成功")
Send("{SPACE}")
$i=1
ExitLoop
endif
Until $i=1
【说明】在这个脚本中,我们使用了“WinActivate”命令,用来在等待指定的窗口出现后,然后“激活”此指定的窗口,这样在正式使用时,不会出现问题(如运行了autoit脚本的安装程序,又运行了其他程序,后运行的程序“覆盖”了autoit脚本的程序,则autoit脚本的程序将不会继续)。
下面我们介绍没有学到的命令。
“do …… Until” 循环语句,在不符合Until后面的条件时,一直执行循环体内的语句。在本节中,跳出“do …… Until”的条件是在两个分支中修改了变量“$i”的值。
“if …… Then …… EndIf”,表示如果条件为真则执行Then到Endif之中的语句。
WinActive,如果指定的对话框出现,则返回值为1,否则为0。
Sleep()为延迟函数,单位为毫秒,如值为1000时表示延迟1秒。
ExitLoop为退出循环函数,可以从While、Do、For循环中退出。
我们介绍一下上面编写的语句的意思,主要是:
① 首先运行KV2006安装程序。
② 进入循环,等待“卸载界面”和“安装界面”的出现,因为安装程序在不同的计算机上,运行所需要的时间不同,所以要循环执行并且在每次循环之后有一段时间的延迟。
③ 如果进入卸载界面,则运行后面的卸载程序,运行完毕后,退出程序。
④ 如果进入安装界面,则有“修复安装”和“新安装”两项,我们用【WinWaitActive("江民杀毒软件KV2006","安装")】代替了【WinWaitActive("江民杀毒软件KV2006","全新安装")】和【WinWaitActive("江民杀毒软件KV2006","修改安装")】两句,所以可以不用再写分支程序。
在使用AutoIt的过程中,只要多做测试,正确捕获对话框或窗口的名称,可以很容易的编写AutoIt的脚本。如果有不熟悉的命令,可以查看AutoIt的帮助文件,它的帮助手册是非常详细的。
最后,我们把制作好的脚本编译成可执行程序,就可以脱离AutoIt来运行了,这样可以直接用在各种环境中(如使用组策略分发软件时,通过编辑相应的zap文件来运行相应的、经过编译的AutoIt脚本程序即可以自动安装软件)。编译成可执行程序的方法有两种,一种是用鼠标右键单击编写好的脚本,选择“Compile Script”即可以编译成可执行程序,如图1-267所示。

图1-267 编译成可执行程序
另一种方法是运行“AutoIt
v

图1-268 转换成exe程序