地球仪上的知识:AutoIt技巧-如何处理安装中的中断

来源:百度文库 编辑:偶看新闻 时间:2024/05/05 11:14:35

AutoIt技巧-如何处理安装中的中断

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已经提供了一个比较好的解决方法,推荐大家使用。