一般来说, 程序受到两种路径长度限制的影响:
这些限制通常被称为 "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 路径可以任意截断.