[AutoHotKey]艰难自学之:#Include命令求解
一、前言:
上一篇帖子得到版主和网友的鼓励,感到十分荣幸,同时也深感自身水平的有限,今后继续努力学习。
二、问题:
在上一篇帖子中,代码行标号为16的语句为:
#Include lib\lib.ahk ;包含入主函数库文件
意思是将脚本所在项目目录中的lib子目录中的lib.ahk文件包含到脚本中。
后来我无意中将脚本拷贝到虚拟盘s:\运行,结果报错。于是注意到#Include命令需要再次深入学习。
三、手册原文引用如下:
来自 <https://wyagd001.github.io/zh-cn/docs/commands/_Include.htm>
四、手册看完后还是一头雾水。
结果在官方论坛找到网友的一片短文介绍如下:
本文的内容也可以直接阅读帮助文档中的 Libraries of Functions 部分获得。
对于函数库目录的用法,由于我没有仔细看帮助文件,我是在接触了 AHK 很久很久之后才陆续在实践中学习到的。。
好了,以下是正文。
引用外部文件最普通的方法是:
#Include 测试.ahk
不在脚本目录的则用完整路径,例如:
#Include d:\test\测试.ahk
但是如果你要经常某个引用外部文件,或者要引用很多外部文件,上面的方法非常浪费时间。这时候可以用函数库目录。
函数库目录 可以建立在三个位置:
- 脚本所在目录\Lib\
- 我的文档路径\AutoHotkey\Lib\ ; %A_MyDocuments%\AutoHotkey\Lib\
- AutoHotkey.exe 所在路径\Lib\
例如把“ahkscript.ahk”放到上面其中的一个 Lib 文件夹中,脚本中就可以直接调用跟文件名相同名称的函数 ahkscript() 或者以文件名为前缀的函数,例如 ahkscript_login(),而无需写 #Include 语句。
如果函数名与文件名不相同,用 #Include 也可以不需要输入路径,#Include <ahkscript> 即可。
来自:<https://www.autohotkey.com/boards/viewtopic.php?f=29&t=8906>
五、试验:
还是上代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
;SetWorkingDir, %A_ScriptDir% ;将脚本所在目录设置为工作目录,先注释掉 当前默认工作目录 := A_WorkingDir ;在调试中查看可知,当前默认工作目录的值为 s:\ ;;;下面练习使用include命令 1 mydir := % ahk目录 . "lib\myLib.ahk" ;目标是 "d:\Program Files\AutoHotkey\lib\myLib.ahk" ;;;__________以下试验的环境: 脚本文件在s:\, 默认的工作目录也是s:\ ;;;__________程序目录和函数库文件d:\Program Files\AutoHotkey\Lib\myLib.ahk文件 ;;;__________我的项目目录和函数库文件:d:\Program Files\AutoHotkey\myVSCode\Lib\Lib.ahk ;;;###以下用法错误 ;#Include mydir ;结果是 "s:\mydir" ,错误 ;#Include %mydir% ;结果是 "s:\%mydir%" ,错误 ;#Include % mydir ;结果是 "s:\% mydir" ,错误 ;#Include Lib ;结果是 "s:\Lib" 错误 ;#Include myLib.ahk ;结果是 "s:\myLib.ahk" ,错误 ;#Include <myLib.ahk> ;这个文件在 "程序\lib" 目录中,结果是函数库没找到,错误 ;#Include <d:\Program Files\AutoHotkey\myVSCode\Lib\Lib.ahk> ;文件在该位置,结果是函数库未找到,错误 ;;;###以下用法正确!! ;#Include <myLib> ;库文件不能加扩展名!!!同时放到ahk程序目录下\lib内, 结果正确 ;#Include <Lib> ;将 "程序\lib" 目录下myLib.ahk文件改名为lib.ahk, 结果正确 ;;;下面练习使用include命令 2 ;;;__________以下试验的环境: 脚本文件在s:\,默认的工作目录也是s:\ ;;;__________建立目录并拷贝文件到:s:\lib\myslibLib.ahk, 以及: s:\sdirlib.ahk ;;;__________为了排除ahk程序文件库目录和库函数文件,特改名如下: ;;;__________程序目录和函数库文件改名为: d:\Program Files\AutoHotkey\wodeLib\wodemyLib.ahk ;;;__________我的项目目录和函数库文件不变:d:\Program Files\AutoHotkey\myVSCode\Lib\Lib.ahk ;;;###以下用法错误 ;#Include <sdirlib> ;结果为库函数找不到,错误 ;#Include <sdirlib.ahk> ;结果为库函数找不到,错误 ;#Include <myslibLib.ahk> ;结果为库函数找不到,错误 ;#Include myslibLib.ahk ;结果为 "s:\myslibLib.ahk" 无法打开,错误 ;;;###以下用法正确!! ;#Include sdirlib.ahk ;结果正确,文件与脚本同目录 ;#Include <myslibLib> ;结果正确,文件在脚本目录下的\lib目录内 ;;;下面练习使用include命令 3 , 通过改变默认工作目录用include命令 ;;;__________以下试验的环境: 脚本文件在s:\, 默认工作目录为s:\,但下面将进行更改 ;;;__________程序目录和函数库为: d:\Program Files\AutoHotkey\wodeLib\wodemyLib.ahk ;;;__________我的项目目录和函数库:d:\Program Files\AutoHotkey\myVSCode\Lib\Lib.ahk ; 先改变默认工作目录 截取位置 := InStr(A_AhkPath,"\",, 0 ) ahk目录 := SubStr(A_AhkPath, 1 ,截取位置) . "wodeLib" SetWorkingDir, %ahk目录% ;将ahk程序目录设置为工作目录 ;注意:SetWorkingDir对#Include没有效果, 因为#Include是在脚本开始执行之前处理的.这是帮助手册原话 ;;;###以下用法错误 ;#Include <wodemyLib> ;结果为库文件找不到 ;#Include wodemyLib.ahk ;结果为 "s:\wodemyLib.ahk" 找不到,说明改工作目录确实对includ命令无效 ;;;###以下用法正确!! ;#Include d:\Program Files\AutoHotkey\wodeLib\wodemyLib.ahk ;;;__________结论__________ ;;;#Include命令写法有 3 种方式: ;;; 1 \是在ahk程序或者脚本目录,建立 "\lib" 目录(用其他目录名不可以), 库文件放其中, ;;;命令写法为:“ #Include <> ” , 在<>中写库函数文件名,但不可带扩展名 ;;; 2 \是与脚本同目录,也就是脚本在当前工作目录 ;;;命令写法为:“ #Include 文件名.ahk ” , 函数库文件名必须带扩展名 ;;; 3 \用绝对路径和文件名. ;#Include d:\Program Files\AutoHotkey\myVSCode\Lib\Lib.ahk ;绝对路径结果正确 ;#Include d:\Program Files\AutoHotkey\Lib\myLib.ahk ;绝对路径结果正确 |
注意,如果试验上述代码的话,试验哪句,就把哪句前面的“;”去掉,实验完这句后再加上.结论在代码的最后几行.
注意,这里仅仅试验手册和网友文章所说包含函数库文件,没有涉及试验不使用#includ命令而直接引用函数名的情况.
谢谢分享!
SetWorkingDir %A_ScriptDir%
#Include %A_ScriptDir%FindText.ahk
或者
#Include
我是这两种写法居多