常见问题(FAQ)

这一部分将列出在官方论坛里经常会被问到的问题.如果您在此处仍不能找到想要的答案,那么 官方论坛将会是您第一个应该去的地方.
当然对于中文用户那么 AUTOIT CN论坛 将是您必去的地方

问题

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正是由于它的...呃...简单性和易用性而闻名:)

 

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

 

回到顶部

03. 怎样把v2.64版的脚本文件转换到v3版本?

其实您要先问自己一个问题"有必要转换脚本吗?".我们将继续提供v2.64的下载和支持,因此不必仅仅为了升级而升级——除非您非要这么做:)

 

本帮助文档中专门有一节说明了v2和v3版本命令的不同点--请点击这里 查看该页.

 

AutoIt v3的一个作者已经编写了一个用来自动转换v2脚本为v3版本的工具.这一转换是非常完美的,除非您的代码到处都含有goto指令:) 您可在"Extras"目录找到此转换工具(开始 \ 所有程序 \ AutoIt v3 \ Extras——或者到AutoIt 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 = '此句中"这个词"是有引号的'

 

回到顶部

08. 究竟窗口"标题"和"文本"参数的意思是什么?

关于这个问题 这里 有详细的描述.

 

回到顶部

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 来注册.

回到顶部