一般来说, 程序受到两种路径长度限制的影响:
这些限制通常被称为 "MAX_PATH 限制", 常量 MAX_PATH, 其值为 260. 这允许驱动器字母, 冒号和斜杠(C:\), 单个文件或目录名的最大长度(255 个字符), 和一个空终止符.
AutoHotkey 在大多数情况下删除了第二种类型, 这使得脚本可以围绕第一种类型工作. 有两种方法可以做到这一点:
\\?\ 使其超过通常的限制. 但是, 有一些系统函数不支持(或者通常不支持长路径). 有关详细信息, 请参阅已知限制.如果底层系统函数支持, \\?\ 前缀 -- 例如, \\?\C:\My Folder -- 将限制增加到 32,767 个字符. 但是, 它通过跳过路径规范化来实现这一点. 路径的某些元素通常会被规范化删除或更改, 但它们会成为文件实际路径的一部分. 必须小心, 因为这允许创建 "正常" 程序无法访问的路径.
特别是, 规范化:
dir\file.ext, \file.ext 和 C:file.ext(注意没有反斜杠).\.. 和 \..\ 替换 / 并消除多余的分隔符.dir.\file) 或尾随的空格和句点(dir\filename . .).在应用前缀之前, 可以通过下面定义的函数将路径传递给 GetFullPathName, 从而显式地规范化路径. 例如:
MsgBox "\\?\" NormalizePath("..\file.ext")
NormalizePath(path) {
cc := DllCall("GetFullPathName", "str", path, "uint", 0, "ptr", 0, "ptr", 0, "uint")
buf := Buffer(cc*2)
DllCall("GetFullPathName", "str", path, "uint", cc, "ptr", buf, "ptr", 0)
return StrGet(buf)
}
带有 \\?\ 前缀的路径也可以被这个函数规范化. 但是, 在这种情况下, 永远不会使用工作目录, 而根目录是 \\?\(例如, \\?\C:\.. 解析为 \\?\, 而 C:\.. 解析为 C:\).
尽管路径本身不再限制为 259 个字符, 但是每个部分(文件或目录名) 也不能超过文件系统施加的硬限制(通常为 255 个字符).
由于底层系统函数的限制, 下面这些不支持长路径:
仅在 Windows 10 启用长路径感知时, SetWorkingDir 和 A_WorkingDir 才支持长路径, 因为无法使用 \\?\ 前缀. 如果工作目录长度超过 MAX_PATH, 则无法使用 Run 来启动程序. 这些限制是由操作系统强加的.
似乎无法运行完整路径超过 MAX_PATH 的可执行文件. 在这种情况下, 就不可能完全测试旨在支持更长的可执行路径的任何更改. 因此, 已为以下各项保留了 MAX_PATH 限制:
错误消息中显示的长 #Include 路径可以任意截断.