常见问题(FAQ)

01. 为什么AutoIt v2.64的旧版脚本不能运行在v3下呢?
02. v3版本是不是会比前一版本更难掌握?
03. 怎样把v2.64版的脚本文件转换到v3版本?
04. “goto”命令哪去了?
05. 怎样在AutoIt中运行DOS程序?
06. 为什么只能用Run()命令来执行.exe 和 .com 文件?对于.msi/.txt 还有其它格式的文件该怎样做呢?
07. 为什么当我尝试使用双引号(“)的时候会发生错误?
08. 究竟窗口”标题”和”文本”参数的意思是什么?
09. 为什么不能使用”我的变量是 $variable”来输出变量?
10. 当我使用Send()命令来输出变量时发生古怪的事情?
11. 返回值和@error究竟有什么不同?
12. 怎样使用热键来退出脚本?
13. 编译脚本时怎样自定义图标?
14. 怎样才能确保只有一个脚本实例运行?
15. 目前AutoIt v3有什么技术上的局限吗?
16. 在AutoIt v3帮助里面不能显示图片(打开脚本按钮).

01. 为什么AutoIt v2.64的旧版脚本不能运行在v3下呢?
v3 具有不同于v2.64的语言结构.

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

02. v3版本是不是会比前一版本更难掌握?
当然不是.事实上在很多情况下它比起前一版本更加容易学习,因为您不需要再尝试强迫让此语言去完成它原本未被设计实现的工作. 此外它还使用了我们所熟悉的类BASIC的语言,而BASIC正是由于它的…呃…简单性和易用性而闻名图片[1]-常见问题(FAQ)-永恒心锁-分享互联网

绝大多数的AutoIt脚本都是用在软件安装以及在许多对话框中点击”下一步”.大部分的这些脚本都可以简单地通过添加一对小括号到特定字符串即可转换为v3版本. 下面就是一个示例,分别演示了在v2和v3中的脚本(模拟了一系列带有 下一步(N) 和 完成(F) 按钮的对话框的软件安装)

; v2.64 Script
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脚本时就可以有语法高亮提示了,这使得脚本的编写更加容易.

04. “goto”命令哪去了
失踪了,呵呵.很不幸.噢不,您不能问为什么——反正就是这样.这就像是在电影 时间劫匪(Time Bandits)结尾时他们在微波发现的那块石头
AutoIt v3 以使用现今大部分常用的”循环”为特色,因此Goto不再是必需的. 请查看 While, Do, For, ExitLoop, ContinueLoop 以及 函数 了解更加先进的解决方式 另外当你看帮助文档的时候, 请查看 循环(loops),条件语句 和 函数 部分的说明. 我向您保证,一旦您熟悉了它们的用法,实际上您将能在几分钟内用其它语言编写程序.
为了让你开始了解这一点,下面演示在2.64版中Goto的最基本用法,同时也是个无限循环:
:mylabel
…执行一些任务…
…其它任务…
goto, mylabel

v3 版中一个总是”true(表达式成立)”的简单的While循环
While 1 = 1
…执行一些任务…
…其它任务…
Wend

05. 怎样在AutoIt中运行DOS程序?
如果您想要执行类似”dir”这样的DOS命令, 那么您必须通过命令解释程序(command.com 或 cmd.exe,决定于您使用的操作系统)来执行. @Comspec(指向命令解释器的全路径) 这个宏指示了此文件的准确位置. 您应该使用 RunWait() 函数来令脚本在DOS程序结束后才继续执行下一行指令.下面是一个示例, 演示了使用DOS的Dir命令来显示C:驱动盘下的文件 (等效于使用 command.com /c Dir C:\ 命令)

RunWait(@COMSPEC & " /c Dir C:\")

06. 为什么只能用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")

或者, 使用 ShellExecuteWait 函数是最好的选择:

ShellExecuteWait("myfile.msi")

07. 为什么当我尝试使用双引号(“)的时候会发生错误?
如果您想要在字符串里面使用双引号,那么您必须连续使用两次双引号. 也就是说每次您要使用引号就应该使用两对.例如,如果您想要设置一个变量为这样的字符串: 此句中”这个词”是有引号的!  那么您应该做的是:
$var = “此句中””这个词””是有引号的”
或者使用单引号也可以:
$var = ‘此句中”这个词”是有引号的’

Window 标题与文本 (基本)
当我们在编写用以实现自动化操作(通常是指窗口操作)的脚本的时候,经常要解决的一个问题就是如何(在众多窗口中)准确识别出目标窗口,一般来说我们把窗口的标题(Title) 作为它的标识,有时候只给标题还不够,这时就需要同时给出标题及文本(text). 要获得某个窗口的标题是件很简单的事情(直接就可以看到),可以使用 AutoIt 提供的 AutoIt Window Info Tool(窗口信息工具). 大多数窗口的标题都是显而易见的,例如系统自带的记事本程序(notepad.exe), 它的标题是无标题 – 记事本, 并不难理解对吧?而且一般来说这就已经足以帮助我们完成自动化任务了.
注意:若作为参数传递到窗口函数的 窗口标题 和 窗口文本 都是空字符串””的话,则该函数的操作目标将会是当前激活的窗口 (但设置了非默认的 窗口匹配模式(WinTitleMatchMode) 时除外)!
窗口标题及其文本是 大小写敏感 (或者说是严格区分大小写)的. 包括标点符号在内您必须确保它们是完全匹配的.为了避免在这种小问题上出错,您可以使用窗口信息工具 (Window Info Tool) 然后选中获得的标题或文本,按下 ctrl-c 复制之后就可以直接粘贴到脚本中使用了.
你可以使用高级模式 强制小写匹配.
AutoIt 的大部分窗口函数都有窗口标题和文本参数, 比如说下面的 WinWaitActive 函数.这个函数的功能是使脚本暂停执行并 一直等到指定窗口出现且激活为止.
WinWaitActive ( “窗口标题”, [“窗口文本”], [超时时间] )
其中窗口标题是必须指定的参数,而 窗口文本 和 超时时间 都是可选参数. 不过也有些函数的窗口文本 参数是必须指定的, 如果想省略这个参数的话只需指定 “” (表示空字符串)作为参数即可.在参数 窗口文本 中指定一个空字符串或者干脆留空的话相当于告诉 AutoIt 任何文本都是有效的(反正只管标题匹配了就OK).
下面以记事本窗口为例说明上面提到的函数的两种用法:

WinWaitActive(“无标题 – 记事本”)

WinWaitActive(“无标题 – 记事本”, “”)
如果我们打些字到该窗口上,比如说”这里是足以区分其它记事本窗口的文字”, 则在 窗口信息工具(Window Info Tool) 的窗口上将会显示相关信息.
我们可以注意到窗口信息工具(Window Info)已经捕捉了这个记事本窗口的标题及文本并显示出来了. 记住,凡是窗口信息工具(Window Info Tool)能捕捉的 AutoIt 也能捕捉到(指能在脚本中使用). 现在我们得到的这些信息已经足以用来准确识别此窗口了(就算此时还打开了很多记事本窗口). 这时我们应该这么使用函数:
WinWaitActive(“无标题 – 记事本”, “This is some text!”)
窗口文本
作为参数使用的窗口文本必须是 AutoIt 能够”看见”的. 一般来说有效的文本是指编辑框控件内的文本(比如像上面的”This is some text!”) 此外还可以使用下面这些文本:
按钮上的文本,比如 &Yes,&No,&Next 确定(&O) 等 (“&”号后的字符将带有下划线)
对话框上的文本,比如 “是否要继续?”
控件上的文本
其它文本-有时您也不知道那是什么
另外还有一个必须了解的技巧就是除了上面这些文本之外,很多程序窗口的标题会根据操作对象的不同而不同(通常会在默认标题后附加), 因此把接在标题后的文本作为窗口文本参数使用也是可以的.
其实我们传递到窗口函数中的 窗口文本 参数是被 AutoIt 当作子字符串(substring)来处理的. 还是以上面的记事本窗口为例,即使把”以区分其它记事本窗口的” 作为窗口文本参数也是可以获得同样效果的.
前面提到的所有应用都是以在默认模式下操作为例的, AutoIt 还提供了其它几种 更高级 的方法.
说明: 隐藏窗口可以使用”窗口标题”进行匹配,前提是”窗口文本”为空(“”).

09. 为什么不能使用”我的变量是 $variable”来输出变量?
如果有个变量名为$msg而您想要在对话框(MsgBox)中输出这一变量,那么下面这种做法是错误的:

MsgBox(0, "示例", "我的变量是 $msg")

实际上它会输出 我的变量是 $msg . 您要做的应该是使用 & 操作符 把字符串和变量连接起来(成为新的字符串):

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")
...
...
; 其它代码
...
...
Func MyExit()
Exit
EndFunc

13. 编译脚本时怎样自定义图标?
您需要运行编译程序(如果是右键点击脚本然后选择编译则不行)来编译脚本. 关于这个问题这里有更详细的描述.
如果您使用的是汉化版本,请编辑脚本头部的 #AutoIt3Wrapper_Icon= 来指定一个图标.

14. 怎样才能确保只有一个脚本实例运行?
1.使用 _Singleton() 函数. 参考用户自定义函数文档得到 _Singleton() 的更多信息.

2.当然,以前最简单的方法是在脚本首次运行时重命名(隐藏的)AutoIt窗口的标题.然后在同一脚本中检查该窗口标题是否存在——如果存在则说明另外一个脚本副本正在运行.

; 请置于脚本顶部
$g_szVersion = "我的脚本"
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万个元素
递归函数能够调用的最大深度: 5100 级
能够同时使用的最大变量数量: 没有限制
用户定义函数的最大数量: 没有限制
GUI窗口的最大数量: 没有限制
每个窗口中的GUI控件的最大数量: 65532

16. 在AutoIt v3帮助中的代码部分里面不能显示图片(打开脚本按钮).
在帮助文件中有个打开脚本按钮,如果不能正常显示.通常是由于 hhctrl.ocx 引起的,您可以在”运行”里面使用 regsvr32 hhctrl.ocx 来注册.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容