laozhhaiJohn 发表于 2021-3-22 19:44

[AutoHotKey]艰难自学之:#Include命令求解

本帖最后由 laozhhaiJohn 于 2021-3-22 20:01 编辑

艰难自学之:#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>

五、试验:
还是上代码:

;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>;结果为库文件找不到
;#IncludewodemyLib.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命令而直接引用函数名的情况.


gaoyonggang66 发表于 2021-3-22 20:17

很牛&#128046;&#128046;&#128046;&#128046;佩服

iphuter 发表于 2021-3-22 20:22

难得还能看到这么详细的学习过程分享

silverkey 发表于 2021-3-22 20:47

这手册都写这样了,还有啥疑问啊,可以百度下绝对路径

zgydsy 发表于 2021-3-22 21:10

可以说是十分励志了

我真的爱发明 发表于 2021-12-4 10:29

为什么说直接引用非常浪费时间呢?

lff283 发表于 2022-11-8 11:44

加油.好好学习天天向上
页: [1]
查看完整版本: [AutoHotKey]艰难自学之:#Include命令求解