返回介绍

指南 - WinZip

发布于 2020-03-05 18:21:26 字数 9213 浏览 1370 评论 0 收藏 0

此页将介绍实现 WinZip 9 SR-1汉化版 的自动安装的方法。我们假定您已经掌握了在 HelloWorld记事本(Notepad)指南中介绍的创建和运行AutoIt脚本的方法,并且懂得使用 AutoIt 窗口信息工具 来读取窗口标题及文字等信息。

这个版本的 WinZip 的安装程序总共有11个对话框是需要点击按钮(通常是 下一步(N))才能继续进行安装的。我们将要写的脚本很简单,就是要等待这些对话框出现然后点击适当的按钮即可。通常安装这类程序会有很多窗口的标题是一样的(WinZip 安装),因此我们必须使用窗口文字来判断不同的窗口。下面提供了每个对话框的截图,您可以点击这些图片来查看它们在 窗口信息工具 中显示的相应信息。

首先创建一个文件夹,复制WinZip的安装程序(winzip90.exe)到此目录,新建一个名为 winzipinstall.au3 的脚本文件置于同一个文件夹之下。

现在我们将一步一步来讲解编写脚本自动安装程序的步骤。每个对话框的截图下都会有进行到该步骤的相应脚本代码(别忘了可以点击这些图片来查看它们在 窗口信息工具 中显示的相应信息)。此外您还可以查看我提供的 完整的脚本 以作参考。

第一行代码非常简单,我们要运行名为 winzip90.exe 的这个安装程序。因此此行脚本应该是这样的:

Run("winzip90.exe")


由于不是官方的英文原版,因此第一个显示的对话框将是汉化作者的声明(也就是广告,^_^):



很明显,要继续装WinZip的话就不能不按确定了。由上图可知 确定 这个按钮是默认按钮,因此我们先等待此信息框出现且处于激活状态然后发送 回车 键击动作即可。那么脚本代码就是下面这样了:

WinWaitActive("WinZip 9.0 SR-1 Build 6224 汉化版", "炎之川")
Send("{ENTER}")


按下确定后第二个对话框将会弹出:

因此我们需要等待此窗口弹出且处于激活状态,接着要按第一个按钮(Setup),留意到该按钮名的S带有下划线,因此发送键击 ALT-s 即可点击它。那么脚本代码就是下面这样了:

WinWaitActive("WinZip Self-Extractor - instA.exe", "&Setup")
Send("!s")

(别忘了可以点击这些图片来查看它们在 窗口信息工具 中显示的相应信息)

如无 意外,接着就会出现安装路径选择对话框:

我们需要等待该窗口变成活动窗口,然后如果您喜欢的话就可以按下回车表示接收此默认安装路径。那么脚本代码就应该是下面这样了:

WinWaitActive("WinZip 安装程序", "到下列文件夹")
Send("{ENTER}")

但为了作更全面的示范,考虑到会有一些用户不喜欢它默认设置的安装路径,因此我们来做一个小小的修改,把路径改为自定义的。以D:\Program Files\WinZip为例,当然我们不需要也不应该按那个 浏览(B)... 按钮来定向到此目录,这样做实在是太麻烦而且不可靠,我们直接在它的编辑框中输入指定路径名即可;另外还要提醒一下,尽管程序为了方便用户已经令输入框成为可输入状态,也就是说可以通过发送键击动作直接输入路径名,但为了增强脚本的可靠性,我们还是使用窗口信息工具来获取该编辑框的名称(点击上面的图片即可查看),结果为Edit1,因此修改上面的脚本代码,变成下面这样:

WinWaitActive("WinZip 安装程序", "到下列文件夹")
ControlSetText("WinZip 安装程序", "到下列文件夹", "Edit1", "D:\Program Files\WinZip" )
Send("{ENTER}")

接下来会出现的就是WinZip的功能介绍对话框:

请注意,此对话框的标题和前面的是完全一样的,都是 WinZip 安装 ——事实上几乎接下来的所有窗口都是使用这个标题!因此,为了准确区分这些窗口,我们还需要再加上一个窗口文字,同时要尽可能使用那些相对具有唯一性的文字。因此我们可选用 WinZip 的功能包括 这些文字。当窗口出现之后我们只要按下 ALT-n 键即可:

WinWaitActive("WinZip 安装", "WinZip 的功能包括")
Send("!n")

接下来将会出现许可协议窗口:

等待该窗口出现然后按下 ALT-y 表示接收此协议:

WinWaitActive("许可协议")
Send("!y")

接下来将会是有着类似风格的几个对话框,因此不再作详细的解释,每张图片下都会有进行到该步骤时相应的脚本代码:

WinWaitActive("WinZip 安装", "快速入门")
Send("!n")

WinWaitActive("WinZip 安装", "在两种界面中进行切换")
Send("!c")
Send("!n")

WinWaitActive("WinZip 安装", "典型设置(推荐)(&E)")
Send("!e")
Send("!n")

WinWaitActive("WinZip 安装", "WinZip 需要与压缩文件格式进行关联")
Send("!n")

这是安装程序的最后一个对话框。请注意,完成 这个按钮没有定义热键——不过幸运的是它“正好”是该对话框的默认按钮,因此我们只需按下回车键即可选到它。如果不是这样的话,我们可能需要使用TAB键在各个控件之间进行切换,或者更好的方法是使用 ControlClick 函数。

WinWaitActive("WinZip 安装", "安装已完成")
Send("{ENTER}")

安装完成后 WinZip 会自动启动:

等待WinZip的主窗口出现然后使用 WinClose 函数关掉它即可。

WinWaitActive("WinZip", "打开压缩文件")
WinClose("WinZip", "打开压缩文件")

为了使脚本更加可靠,我们还需要尽可能考虑各种意外的发生,比如该软件已经被用户安装好了,那么当在第二个对话框中按下 Setup 这个按钮时将会出现意料之外的窗口:



很明显,既然程序已经被安装好了,我们就不必再进行后面的操作了,因此我们需要按下 取消 这个按钮或关闭此窗口皆可:

If WinExists("WinZip Setup", "注册副本已安装") Then
WinClose("WinZip Setup", "注册副本已安装")
;EndIf ;还需要添加下面的脚本才能结束此表达式


我想您肯定注意到了,上面的代码使用了If...Then表达式,同时还使用了 WinExists 函数,这段脚本的具体意思是:如果指定窗口存在则关闭该窗口。

关闭该窗口后会出现提示窗口:



很简单,关闭此窗口即可,安装程序将自动退出。

WinWaitActive("WinZip 安装程序", "软件没有成功安装")
WinClose("WinZip 安装程序", "软件没有成功安装")


不过事情还不是那么简单,实际运行此脚本时会发现一个问题:如果程序已经安装过,则当然会出现上面的窗口,但是脚本却没有做我们希望它做的事情——关闭窗口。其实仔细研究就会知道,这个表达式只是进行一次即时的检测,由于时间过快,检测完窗口才出现,因此会造成脚本暂停,不能继续处理这个意外中断。或许您可能会想到不停地进行检测(也就是循环)来解决问题,其实不用这样做,使用 Adlib 函数即可解决,这个函数就是专门用来处理这些“意外”的(其实也相当于是循环,它默认是每隔250毫秒就调用自定义函数)。因此把上面的脚本修改为这样:

AdlibEnable("end")
Func end()
 If WinExists("WinZip Setup", "注册副本已安装") Then
  WinClose("WinZip Setup", "注册副本已安装")
  WinWaitActive("WinZip 安装程序", "软件没有成功安装")
  WinClose("WinZip 安装程序", "软件没有成功安装")
  Exit
 EndIf
EndFunc
;AdlibDisable() ;在脚本的最后位置添加此行


现在您可以查看 完整脚本 ——请注意,我把每个对话框的步骤分开并添加了注释部分,这样比较容易读懂而且方便将来进行修改(下一版本的WinZip大概也是只有轻微改动而已)。

大功告成!现在运行一下 winzipinstaller.au3 这个脚本吧,您会看到WinZip将在很短的时间之内被安装好!在此页使用的技术也可用来实现大多数程序的自动化安装。

下面给各位读者一个小小的练习题吧,请尝试再编写一次这个脚本,但不要使用 Send 函数(它会向激活窗口发送键击动作),试试用 ControlClick 函数吧,这会令脚本更加可靠。在此之前您或许应该熟读关于 控件(Controls) 的说明。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文