【bat】特殊文字(&, ^, |, >, <, ( ))を含むとエラーになるときの回避方法

バッチファイルで処理対象のファイル名や文字列に「&」「^」「|」「>」「<」「( )」といった特殊文字が含まれていると、コマンド解釈で区切りやリダイレクトとして扱われ、意図しない動作やエラーが発生することがあります。
これは cmd.exe の仕様によるもので、単純に echo したり del したりするだけでも影響を受けます。
本記事では、このような特殊文字を含む場合の回避方法を整理します。

原因:特殊文字はコマンド解釈で意味を持つ

cmd.exe では以下の文字がメタ文字として扱われます。

  • &:コマンドの連結
  • |:パイプ処理
  • > <:リダイレクト
  • ( ):ブロック
  • ^:エスケープ

そのため、ファイル名や文字列にこれらが含まれると、意図と異なる解釈をされてしまいます。

解決策1:二重引用符で囲む

パスや文字列に特殊文字が含まれる場合は、必ず二重引用符で囲みます。
これで大半のケースは解決できます。

@echo off
set "FILE=C:\work\report&2025.txt"
echo "%FILE%"
del "%FILE%"

解決策2:^ でエスケープする

どうしても特殊文字を文字として扱いたい場合は、^を前に付けてエスケープします。

@echo off
echo A^&B
echo (Test^)
echo 100^>value

この場合、実際の出力は「A&B」「(Test)」「100>value」となります。

解決策3:echo の特例(echo( を利用する)

echo コマンドは後に特殊文字が続くと誤解釈されやすいです。
その場合は echo( を使うことで安全に出力できます。

@echo off
echo(100%
echo(>サンプル

解決策4:for /f で読み込むときの注意

for /f は標準入力やファイルを解析するときに特殊文字を解釈してしまうことがあります。
この場合は usebackqdelims= を指定し、内容をそのまま受け取るようにします。

@echo off
for /f "usebackq delims=" %%A in ("list.txt") do (
  echo "%%A"
)

解決策5:PowerShellを利用する

複雑な文字列処理が必要な場合や、特殊文字を多用する場合は PowerShell を呼び出すのが確実です。
PowerShell では文字列リテラルを明示できるため、cmd.exe 特有の解釈の影響を受けにくくなります。

@echo off
powershell -NoProfile -Command "Write-Output 'A&B (Test) 100>value'"

まとめ

バッチファイルで特殊文字を扱うときのポイントは以下のとおりです。

  • 常に二重引用符で囲む
  • 必要に応じて ^ を使ってエスケープする
  • echo には echo( を使うと安全
  • for /f は delims= を明示
  • 複雑な場合は PowerShell を呼ぶ

これらを押さえておけば、「&」「|」「( )」「>」「<」などを含むファイル名や文字列も安全に扱えるようになります。