【bat】ファイルパスの長さ制限に引っかかったときの対処法

Windowsのバッチファイルで処理をしていると「指定されたパスが長すぎます」「The filename or extension is too long」といったエラーに遭遇することがあります。
これは、Windowsの従来仕様として「パス長MAX_PATH=260文字」の制限が存在するためです。
特に深い階層のディレクトリや自動生成された長いファイル名を扱うときに問題になります。本記事では、バッチファイルで長いパスを扱う際の解決策を解説します。

原因:Windowsのパス長制限

Windows APIの多くは MAX_PATH=260文字 を超えるパスを扱えません。
通常のコマンドプロンプトやバッチファイルもこれに依存しているため、長すぎるパスはエラーになります。

解決策1:\?\ プレフィックスを使う

長いパスを扱う場合、特殊なプレフィックス\\?\を付けることで、ほとんどの内部APIが長いパスを解釈できるようになります。

@echo off
set "LONGPATH=\\?\C:\very\long\directory\structure\...\filename.txt"
echo %LONGPATH%
del %LONGPATH%

ただしすべてのコマンドで有効というわけではなく、対応していないコマンドもあるため注意が必要です。

解決策2:Windows 10以降で長いパスを有効化する

Windows 10 Anniversary Update(1607)以降では、グループポリシーやレジストリを変更することでシステム全体で長いパスを有効化できます。

  • グループポリシー:「ローカルコンピュータポリシー」 → 「コンピュータの構成」 → 「管理用テンプレート」 → 「システム」 → 「ファイルシステム」 → 「Win32 の長いパスを有効にする」を有効化
  • レジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemLongPathsEnabled(DWORD 32bit値)を追加し、値を 1 に設定

解決策3:ディレクトリ構造を浅くする

バッチでの一時的な対処として、処理対象のファイルをルートに近い場所へ移動する方法があります。
例えば、作業用にC:\workを用意してコピーしてから処理すると、パス長の問題を回避できます。

@echo off
set "SRC=C:\very\long\path\to\file.txt"
set "DST=C:\work\file.txt"
copy "%SRC%" "%DST%"

解決策4:robocopyやPowerShellを利用する

通常のcopyxcopyでは長いパスが扱えないことがあります。代わりにrobocopyを使うと長いパスに対応できます。

@echo off
robocopy "C:\very\long\path" "C:\backup" filename.txt

さらに柔軟に処理したい場合は、PowerShell経由でファイル操作を行うのも有効です。

powershell -NoProfile -Command "Copy-Item -LiteralPath 'C:\very\long\path\to\file.txt' -Destination 'C:\backup\'"

解決策5:短縮パス(8.3形式)を使う

古い方法ですが、dir /xで表示される短縮パスを利用することで、文字数を減らして扱えることがあります。
ただし環境によって8.3形式が無効になっている場合もあるため万能ではありません。

まとめ

バッチファイルでファイルパスの長さ制限に引っかかった場合は、次の手順で対応するのが効果的です。

  • \\?\プレフィックスを試す
  • Windows 10以降なら長いパスを有効化する
  • 作業ディレクトリを浅くして処理する
  • robocopyやPowerShellを活用する
  • 最後の手段として8.3形式を検討

環境やコマンドの互換性を考慮しつつ、上記の方法を組み合わせて活用すれば、長いパスでも安定して処理できるようになります。