コマンドプロンプト %〜% のエスケープ

コマンドライン・プロセッサは、入力文字列に対して、

検索文字列: %環境変数%
置換文字列: 環境変数の値

という置換処理を行う。

したがって %〜% は 〜 に対応する環境変数があれば、
%〜% は、その環境変数の内容で置換され、
なければ %〜% という文字列がそのまま残る。
%〜% や %1 などの置換処理後は % はリテラルとして扱われ & | 空白などの特殊な意味を持たない。

次の使用例を見ると %〜% のペアは前方から処理されることがわかる。

C:\>set SystemRoot
SystemRoot=C:\Windows

C:\>echo %SystemRoot%SystemRoot%
C:\WindowsSystemRoot%

この性質を利用すれば以下のように、
%環境変数% をそのままプログラムに渡すことが出来る。

C:\>set ZZZ=%

C:\>set ZZZ
ZZZ=%

C:\>echo %ZZZ%SystemRoot%
%SystemRoot%

コマンド ラインにカレット (^) 文字があると、その直後の文字は制御文字としてではなくリテラル文字として解釈されます。したがって、引用符 (")、スペース、先頭のスラッシュ、カレット、その他の任意のリテラル文字をパラメータまたはスイッチの値に直接埋め込むことができます。ただし、スイッチ名には埋め込むことができません。次に例を示します。
>Edit.Find ^^t /regex
カレットは、引用符の前後のどちらに置かれた場合でも同じ働きをします。行の最後の文字がカレットの場合は無視されます。
http://msdn.microsoft.com/ja-jp/library/aa301845(v=VS.71).aspx

キャレットは基本的にはキャレットの直後の制御文字に作用し、% には直接作用しない。

キャレットの処理は環境変数の置換の後に行われるようなので、
% の直後にキャレットを置くことによって結果的に % をエスケープ出来る。

たとえば、%SystemRoot% をそのまま出力したいときには、
%^SystemRoot% とすると、^SystemRoot という環境変数が見つからないため
結果、%SystemOut% という文字が出力される。

C:\>echo %^SystemRoot%
%SystemRoot%