Humanity

Edit the world by your favorite way

バッチファイルでの引数のダブルクォートの扱い方と特殊文字の扱い方

気を付ける事は3つ。特に最後が重要。
人生は限られているし、たいてい人生の終わりより納期が先に来るはず。

  1. 関数呼び出し側は必ずダブルクォートで括る
    • 半角スペース、()等を含む引数は必ず括る必要があるが、常に括っていた方が無難。
    • 「cmd /?」を実行した際の末尾の出力から引用すると引用符が必要な特別な文字は「<半角スペース>&()[]{}^=;!'+,`~」
  2. 呼び出された関数側で引数を参照する際は「"%~1"」のように「~」を付け、ダブ ルクォートを取り除いた上で更にダブルクォートで囲む
    • 呼び出し元の引数をダブルクォートで囲んでいた場合、%1は「"不運(ハードラック)と踊(ダンス)っちまったんだよ…"」のようにダブルクォートで囲まれたままになる
    • なので"%1"は「""不運(ハードラック)と踊(ダンス)っちまったんだよ…""」のように二重でダブルクォートに囲まれた文字列になってしまう
    • これを避けるため、関数側で引数を参照する際は(例え呼び出し元の引数がダブルクォートに囲まれていなくても)「"%~1"」のように書くことで常にダブルクォートに囲まれた状態の文字列を取得できる
  3. 特殊文字をエスケープしようとしてもダメな時はダメなので早々に諦め他の解決策を探す *1

まぁそれよりもうすぐ2016年にもなるというのにバッチファイルプログラミングなんて不毛な事に首を突っ込まないためにどうするかを考える事の方が重要ですね。

*1:PowerShellを使う等