一般的に、プログラムは2種類のパス長制限の影響を受ける:
これらの制限は、値260を持つ定数MAX_PATH
にちなんで、しばしば「MAX_PATH制限」と呼ばれる。一般的に1文字はヌルターミネーターとして予約され、259文字が実際のパスに残される。
AutoHotkeyはほとんどの場合、2番目の種類を削除し、スクリプトが1番目の種類を回避できるようにします。これには2つの方法がある:
\\?\
を付けると、通常の制限を超えることができる。しかし、システム機能によっては(あるいは一般的に長いパスを)サポートしていないものもある。詳細は「既知の制限事項」を参照。基礎となるシステム機能でサポートされている場合、例えば\\?\C:\My Folder
"のように、\\?\
という接頭辞を付けると、32,767文字に制限されます。しかし、これはパスの正規化をスキップすることによって行われる。通常、正規化によって削除または変更されるパスの一部の要素は、代わりにファイルの実際のパスの一部になります。これにより、「通常の」プログラムがアクセスできないパスが作成される可能性があるため、注意が必要である。
特に正規化だ:
dir\file.ext
, \file.ext
, C:file.ext
のような相対パスを解決する(スラッシュがないことに注意)。\..
や \.
のような相対コンポーネントを解決する。/
を \
に置き換え、冗長なセパレータを削除します。dir.\file
)の末尾のピリオド1個や、末尾のスペースやピリオド(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文字)を超えることはできません。
これらは、基礎となるシステム機能の制限により、長いパスをサポートしていない:
SetWorkingDirと A_WorkingDirは、\\?\
接頭辞が使用できないため、Windows 10のロング・パス認識が有効な場合にのみロング・パスに対応します。作業ディレクトリがMAX_PATHを超えると、Runでプログラムを起動できなくなる。これらの制限はOSによって課される。
MAX_PATHを超えるフルパスで実行ファイルを実行することはできないようです。そうなると、より長い実行可能パスをサポートすることを目的とした変更を完全にテストすることはできない。そのため、MAX_PATHの制限は以下のように残されている:
エラーメッセージに表示される長い#Includeパスは、任意に切り捨てられる可能性があります。