バッチファイルの記述において、以下のような書き方を目にすることがあります。
set "myVariable=Hello World"
本記事では、上記の書き方のメリットについてサンプルコードと共に紹介します。
setコマンドの代入全体をダブルクォートで囲う理由
setコマンドの代入右辺において、コマンドラインやバッチファイルで特別な意味を持つ特殊文字(例えば &, |, >, < など)を含む場合に、setコマンドの動作の信頼性を高めるために使用します。
主な特殊文字の役割は以下の通りです。
- &:二つのコマンドを連結して実行します。
- |:前のコマンドの出力を次のコマンドの入力として渡します(パイプライン)。
- >:前のコマンドの出力をファイルにリダイレクトします。
- <:ファイルの内容をコマンドの入力としてリダイレクトします。
サンプルコード
ここでは、バッチファイルにおいて特殊文字 & を含む文字列 “Hello & World” を表示するケースを例に、setコマンドが期待通りに動作する例と、期待通りに動作しない例を紹介します。
期待通りに動作する例
setコマンドの後に記述する代入文を、すべてダブルクォートで囲います。また、特殊文字は ^ を使用してエスケープします。
@echo off
set "myVariable=Hello ^& World"
echo %myVariable%
pause
実行結果
Hello & World
続行するには何かキーを押してください . . .
期待通りに動作しない例1
“Hello & World” を直接代入の右辺に記述する場合、エラーが発生して “Hello & World” を表示できません。
@echo off
set myVariable=Hello & World
echo %myVariable%
pause
実行結果
'World' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Hello
続行するには何かキーを押してください . . .
このエラーは、echoコマンド実行時に、以下のように展開されるために発生します。(echo Hello を実行したあと、World コマンドを実行する)
echo Hello & World
期待通りに動作しない例2
setコマンドの右辺をダブルクォートで囲ってみます。
@echo off
set myVariable="Hello & World"
echo %myVariable%
pause
実行結果
"Hello & World"
続行するには何かキーを押してください . . .
このようにすると、Hello & World の前後に余分なダブルクォートが表示されてしまいます。
期待通りに動作しない例3
setコマンドの後に記述する代入文を、すべてダブルクォートで囲います。実験のため、特殊文字のエスケープは行いません。
@echo off
set "myVariable=Hello & World"
echo %myVariable%
pause
実行結果
Hello
'World' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .
こちらも、期待通りに動作しない例1と同様に、& が二つのコマンドを連結して実行する特殊文字として扱われたようです。
まとめ
本記事は、バッチファイルのsetコマンドの代入全体をダブルクォートで囲う書き方のメリットについて紹介しました。特殊文字をバッチファイルに自分で書く場合は、エスケープの使用にもご注意ください。