当前位置:文档之家› autoit3入门指南

autoit3入门指南

autoit3入门指南

指南 - 记事本(Notepad)
此页将介绍自动打开记事本程序、输入指定文字、最后关闭记事本的方法。我们假定您已经掌握了在 HelloWorld 指南中介绍的创建并运行AutoIt脚本的方法。
首先创建一个新的脚本文件,命名为 npad.au3 然后打开它进行编辑(按您自己的习惯使用记事本程序或 SciTe 都可以)。
我们首先需要了解的是记事本程序的可执行文件名,也就是 notepad.exe——您可以在开始菜单中寻找记事本的快捷方式图标,从其属性中可获得这一信息(指文件名)。要运行记事本程序,我们使用AutoIt 的 Run 函数。此函数用以运行可执行文件并继续下一步操作。
在脚本的第一行输入以下代码:
Run("notepad.exe")
运行此脚本——如果一切正常的话则记事本将被打开。
当对应用程序进行自动化操作时AutoIt可检测窗口标题,这样它就能针对该窗口进行操作。很明显,记事本的窗口标题就是 无标题 - 记事本(若OS是英文版则为 Untitled - Notepad)。当应用窗口标题时AutoIt 是区分大小写的,因此您必须确保标题完全一致——最好的方法是使用AutoIt 窗口信息工具来获取窗口标题。此窗口信息工具可在这里找到:开始菜单 \ 所有程序 \ AutoIt v3 \ AutoIt Window Info.
打开窗口信息工具之后再点击记事本的窗口来激活记事本(使其变为活动窗口),此时窗口信息工具将显示记事本窗口的有关信息。我们现在需要获得的是窗口的标题。

在AutoIt Info Tool的窗口中选中窗口标题名然后按下CTRL-C以复制名称到剪贴板——这样我们就可以在脚本中直接粘贴标题而不怕打错字了。
在 运行 了记事本的一个副本之后我们需要等待它的窗口出现并且变成激活窗口才能发送键击动作。使用 WinWaitActive 函数即可实现这一目的。在AutoIt中大多数有关窗口操作的函数都带有窗口标题参数。
在脚本的第二行输入以下代码(按下CTRL-V 或者 编辑 \粘贴 命令来粘贴刚才复制到剪贴板的窗口标题)
WinWaitActive("无标题 - 记事本")
在我们可以确定记事本窗口可见之后,下一步就是要键入一些文字了。使用 Send 函数即可实现这一目的。
在脚本中添加以下这行代码。
Send("This is some text.")
整个脚本应该是这样:
Run("notepad.exe")
WinWaitActive("无标题 - 记事本")
Send("This is some text.")
关闭我们之前打开的记事本程序(每次您运行此脚本都要这么做否则你会发现有许多记事本窗口打开!)。然后运行脚本。
您应该会看到记事本打开了,接着一些文字将如变戏法般出现在记事本的编辑区域!
下一步我们需要关掉记事本,使用 WinClose 函数即可实现这一目的。
WinClose("无标题 - 记事本")
当记事

本要关闭时会有一个对话框提示您是否保存文件。使用窗口信息工具获取此对话框的详细信息以便做出回应:)

因此我们需要再添加一行代码等待该对话框变成激活状态(为了和原有的记事本窗口区别开来,我们需要使用窗口文字参数来令函数更加准确):
WinWaitActive("记事本", "文件 无标题 的文字已经改变")
下一步是自动按下ALT-N 来选择 否(N) 这个按钮(窗口中带有下划线的字母通常用以说明可以同时按下ALT键及该字母键作为快捷键进行操作)。在 Send 函数中要发送ALT键可使用 ! 来表示
Send("!n")
最后完整的脚本如下:
Run("notepad.exe")
WinWaitActive("无标题 - 记事本")
Send("This is some text.")
WinClose("无标题 - 记事本")
WinWaitActive("记事本", "文件 无标题 的文字已经改变")
Send("!n")
运行此脚本您就会看到记事本打开,接着文字出现,最后被关闭!现在您应该能够应用在此指南中学到的技术进行其它应用程序的自动化操作了。

常见问题解答 (FAQ)
这一部分将列出在 论坛 里经常会被问到的问题。如果您在此处仍不能找到想要的答案,那么 论坛 将会是您第一个应该去的地方。
问题
1. 为什么AutoIt v2.64的旧版脚本不能运行在v3下呢?
2. v3版本是不是会比前一版本更难掌握?
3. 怎样把v2.64版的脚本文件转换到v3版本?
4. “goto”命令哪去了?
5. 怎样在AutoIt中运行DOS程序?
6. 为什么只能用Run()命令来执行.exe 和 .com 文件?对于.msi / .txt 还有其它格式的文件该怎样做呢?
7. 为什么当我尝试使用双引号(")的时候会发生错误?
8. 究竟窗口“标题”和“文字”参数的意思是什么?
9. 为什么不能使用"我的变量是 $variable"来输出变量?
10. 当我使用Send()命令来输出变量时发生古怪的事情?
11. 返回值和@error究竟有什么不同?
12. 怎样使用热键来退出脚本?
13. 编译脚本时怎样自定义图标?
14. 怎样才能确保只有一个脚本实例运行?
15. 目前AutoIt v3有什么技术上的局限吗?

1. 为什么AutoIt v2.64的旧版脚本不能运行在v3下呢?
v3 具有不同于v2.64的语言结构。
AutoIt的前一个版本能够很好地应付它被设计用以满足的需求——编写简单的脚本来实现软件的自动安装。但是随着发展人们开始需要使用它来进行更加常见且复杂的脚本任务。旧有的语法和结构虽然还是可以实现这些,但编写起来却非常的困难而且麻烦。于是我们决定要改进 AutoIt 使其更加适合常见的自动化任务并且可以成为更标准且类似BASIC的语言。这就意味着如果您已经懂得脚本语言的编写的话,那么您就能很快地掌握AutoIt v3。
回到顶部
2. v3版本是不是会比前一版本更难掌握?
当然不是。事实

上在很多情况下它比起前一版本更加容易学习,因为您不需要再尝试强迫让此语言去完成它原本未被设计实现的工作。此外它还使用了我们所熟悉的类BASIC的语言,而BASIC正是由于它的...呃...简单性和易用性而闻名:)
绝大多数的AutoIt脚本都是用在软件安装以及在许多对话框中点击“下一步”。大部分的这些脚本都可以简单地通过添加一对小括号到特定字串即可转换为v3版本。下面就是一个示例,分别演示了在v2和v3中的脚本(模拟了一系列带有 下一步(N) 和 完成(F) 按钮的对话框的软件安装)
; v2.64 脚本
WinWaitActive, 欢迎, 欢迎使用XSoft安装程序
Send, !n
WinWaitActive, 选择安装目标文件夹, 请选择
Send, !n
WinWaitActive, 已准备好安装所需信息, 点击[下一步]开始进行安装
Send, !n
WinWaitActive, 安装完成, 点击[完成]退出安装程序
Send, !f
WinWaitClose, 安装完成
; v3 脚本
WinWaitActive("欢迎", "欢迎使用XSoft安装程序")
Send("!n")
WinWaitActive("选择安装目标文件夹", "请选择")
Send("!n")
WinWaitActive("已准备好安装所需信息", "点击[下一步]开始进行安装")
Send("!n")
WinWaitActive("安装完成", "点击[完成]退出安装程序")
Send("!f")
WinWaitClose("安装完成")
看来还不是太难!:)由于所有的“字串”都附上了引号,因此您再也不用受到由文本头部和尾部的空格引起的问题的困扰了。同时还有个非常爽的好处就是可以支持许多 文本编辑器 ,因此在编写v3脚本时就可以有语法高亮提示了,这使得脚本的编写更加容易。
回到顶部
3. 怎样把v2.64版的脚本文件转换到v3版本?
其实您要先问自己一个问题“有必要转换脚本吗?”。我们将继续提供v2.64的下载和支持,因此不必仅仅为了升级而升级——除非您非要这么做:)
本帮助文档中专门有一节说明了v2和v3版本命令的不同点——请点击 这里 查看该页。
AutoIt v3的一个作者已经编写了一个用来自动转换v2脚本为v3版本的工具。这一转换是非常完美的,除非您的代码到处都含有goto指令:)您可在“Extras”目录找到此转换工具(开始 \ 所有程序 \ AutoIt v3 \ Extras——或者到AutoIt v3的安装目录中寻找)。
回到顶部
4. “goto”命令哪去了?
失踪了,呵呵。很不幸。噢不,您不能问为什么——反正就是这样。这就像是在电影 时间劫匪(Time Bandits)结尾时他们在微波发现的那块石头:)
AutoIt v3 以使用现今大部分常用的“循环”为特色,因此Goto不再是必需的。请查看 While, Do, For, ExitLoop, ContinueLoop 以及 Functions 了解更加先进的解决方式:) 另外当你看帮助文档的时候,请查看 循环(loops), 条件语言(conditional statements) 和 functions 部分的说明。我向您保证,一旦

您熟悉了它们的用法,实际上您将能在几分钟内用其它语言编写程序。
为了让你开始了解这一点,下面演示在2.64版中Goto的最基本用法,同时也是个无限循环:
:mylabel
...执行一些任务...
...其它任务...
goto, mylabel
v3 版中一个总是“true”的简单的While循环
While 1 = 1
...执行一些任务...
...其它任务...
Wend
如果v3版发布之后引起了大规模的抗议的话,我或许会考虑再次把它(goto)加入到AutoIt中,但将仅仅是帮助大家转换脚本。
回到顶部
5. 怎样在AutoIt中运行DOS程序?
如果您想要执行类似“dir”这样的DOS命令,那么您必须通过命令解释程序(https://www.doczj.com/doc/5612987464.html, 或 cmd.exe,决定于您使用的操作系统)来执行。@Comspec(指出命令解释器全路径名) 宏指定了此文件的准确位置。您应该使用 RunWait() 函数来令脚本在DOS程序结束后才继续执行下一行指令。下面是一个示例,演示了使用DOS的Dir命令来显示C:驱动盘下的文件(等效于使用 https://www.doczj.com/doc/5612987464.html, /c Dir C:\ 命令)
RunWait(@COMSPEC & " /c Dir C:\")
回到顶部
6. 为什么只能用Run()命令来执行.exe 和 .com 文件?对于.msi / .txt 还有其它格式的文件该怎样做呢?
只有少数文件扩展是“可运行”的——通常这些文件是.exe, .bat, .com, .pif。其它类型的文件如.txt 和 .msi实际上是借助其它程序来执行的。比如当您双击“myfile.msi”文件的时候,实际上在后台执行的命令是“msiexec.exe myfile.msi”。所以要在AutoIt中运行一个.msi文件就需要这样做:
RunWait("msiexec myfile.msi")
或者用更简单的方法,就是使用“start”命令,它会自动为您处理这个文件:
RunWait(@COMSPEC " /c Start myfile.msi")
回到顶部
7. 为什么当我尝试使用双引号(")的时候会发生错误?
如果您想要在字串里面使用双引号,那么您必须使用两次双引号。也就是说每次您要使用引号就应该使用两对。例如,如果您想要设置一个变量为这样的字串:此句中"这个词"是有引号的! 那么您应该做的是:
$var = "此句中""这个词""是有引号的"
or use single quotes instead:
$var = '此句中"这个词"是有引号的'
回到顶部
8. 究竟窗口“标题”和“文字”参数的意思是什么?
关于这个问题 这里 有详细的描述。
回到顶部
9. 为什么不能使用"我的变量是 $variable"来输出变量?
如果有个变量名为$msg而您想要在对话框(MsgBox)中输出这一变量,那么这样做是无效的:
MsgBox(0, "示例", "我的变量是 $msg")
实际上它会输出 我的变量是 $msg 。您要做的是告诉AutoIt要使用 & 操作符 把字串和变量结合在一起:
MsgBox(0, "示例", "我的变量是" & $msg)
进阶:如果您有很多变量需要添加到某个字

串当中,那么您会发现 StringFormat() 函数将是非常有用的。例如,如果我想要在某个字串中插入$var1 到 $var5 这五个变量,那么更简单的方法就是这样了:
$msg = StringFormat("变量1是 %s, 变量2是 %s, 变量3是 %s, V变量4是 %s, 变量5是 %s", $var1, $var2, $var3, $var4, $var5)
MsgBox(0, "示例", $msg)
回到顶部
10. 当我使用Send()命令来输出变量时发生古怪的事情?
如果您要 输出 变量的内容,那么请小心检查它是否含有 ! ^ + {SPACE} 这样的特殊的发送字符,因为它们将会被解释为特殊的键击动作——而这很少会是我们希望它做的。要克服这一问题,请使用 Send() 函数的原文模式,这样就不会解释这些特殊按键了:
Send($myvar, 1)
回到顶部
11. 返回值和@error究竟有什么不同?
一般来说返回值是用来指示某个函数的成功执行。但是,如果某个函数已经返回了一些值(比如 WinGetText()),那么我们就需要找到一种方法来确定函数是否成功执行,因此我们用 @error 来代替。
回到顶部
12. 怎样使用热键来退出脚本?
噢,这算是个简单问题了。如果您想要在按下某个按键组合后可以退出脚本,那么请使用 HotKeySet() 函数来设置指定按键被按下后执行的用户函数。这个用户函数应该仅含有 Exit 关键字。
下面这些脚本演示的是在按下CTRL+ALT+x后退出脚本:
HotKeySet("^!x", "MyExit")
...
...
; Rest of ******
...
...
Func MyExit()
Exit
EndFunc
回到顶部
13. 编译脚本时怎样自定义图标?
您需要运行编译程序(而不是右键点击脚本然后选择编译)。关于这个问题 这里 有详细的描述。
回到顶部
14. 怎样才能确保只有一个脚本实例运行?
最简单的方法是在脚本首次运行时重命名隐藏的AutoIt窗口的标题。然后在同一脚本中检查该窗口标题是否存在——如果存在则说明另外一个脚本副本正在运行。
; 请置于脚本顶部
$g_szVersion = "My ****** 1.1"
If WinExists($g_szVersion) Then Exit ; 此脚本已经运行了
AutoItWinSetTitle($g_szVersion)
; 下面是脚本的其它代码
回到顶部
15. 目前AutoIt v3有什么技术上的局限吗?
下面详细列出目前AutoIt在技术上的局限。要注意的是,一些所谓的限制其实是理论上的,因此往往在能达到实际限制之前您就会碰到有关性能和内存的问题。

最大单行脚本长度: 4,095
最大字串长度: 2,147,483,647 个字符
数字范围(浮点): 1.7E–308 到 1.7E+308 有 15 位的精确度
数字范围(整数): 64 位带符号整数
十六进制数目: 32 位带符号整数(0x80000000 到 0x7FFFFFFF)
阵列: 最大64维 和/或 共1600万个元素
递归函数能够调用的最大深度: 384 级
能够同时打开的最大文件数量

: 64
能够同时激活的最大热键数量: 64
能够同时使用的最大变量数量: 没有限制
用户定义函数的最大数量: 没有限制
GUI窗口的最大数量: 1024
每个窗口中的GUI控件的最大数量: 4096
回到顶部

相关主题
相关文档 最新文档