バッチ ファイル内の % と %% の違い
バッチ プログラマーは、バッチ ファイルで使用するときに、単一のパーセント記号 (%) と二重のパーセント記号 (%%) を混同することがよくあります。 コマンド ラインで実行する場合、FOR コマンドは %f を使用しますが、バッチ ファイルでは、単一のパーセント記号の代わりに %%f を使用します。
シンボル %、%%、%variable% および !variable! にはいくつかの基本的な違いがあり、コマンド ラインとバッチ ファイルで別々に使用されます。
このチュートリアルでは、バッチ ファイル内の % と %% の違いを示します。 また、バッチ ファイルとコマンドでの % と %% の使用、および環境変数とループ変数についても説明します。
CMD での % と %% の使用
コマンドライン シェルでは、%variable は 1 文字の置き換え可能なパラメーターを指定します。 Ms-DOS は、%1,%2,...,%9 を置換可能なコマンド ライン パラメータとして使用します。つまり、%1 はバッチ ファイルに渡される最初のパラメータに置き換えられます。
次の例は、変数 (%a) を持つ単一のパーセント記号が null 文字として機能することを示しています。
set a="Hello World"
echo %a

パーセント記号が変数の両側に使用されている場合、つまり %VARIABLE% は環境変数として機能し、echo コマンドで使用すると設定値が表示されます。 %VARIABLE% は set コマンドで設定でき、echo コマンドでアクセスできます。
以下に例を示します。
set a="Hello World"
echo %a%

バッチファイルでの % と %% の使用
バッチ ファイルでは、コマンド ライン シェルはすべてのコマンドを左から右に読み取ります。 パーセント記号を読み取った場合は、次の文字をチェックして続行します。
%% を単一の % として読み取ります。つまり、%% を単一のパーセントで置き換え、3 番目の文字を読み取ります。 FOR ループ内にある場合は、FOR ループ内のように評価されます。
次の例は、FOR ループでの %% の使用を説明しています。
FOR /L %%3 in (1,1,3) Do Echo %%3
PAUSE

出力:

FOR ループでない場合は、プレーンな文字として読み取り、コマンドライン シェルで直接実行すると %variable コマンドと同じように実行されます。
set a="Hello World"
echo %%a
PAUSE

出力:

% 記号の後の文字が数字の場合、コマンド ライン パラメーターとして読み取られます。 % の後の文字が % 記号でも数字でもない場合、次の % 記号まで変数として読み取られます。 次に、その値が表示されます。
例えば、
set a="Hello World"
echo %a%
PAUSE

出力:

50% のようなバッチ ファイルでプレーンな % 記号を使用するには、単一の % 記号の代わりに %% を使用する必要があります。
set a="The battery is charged 50%%"
echo %a%
PAUSE

出力:

% と %% は主に FOR コマンドで使用されます。 FOR コマンドがバッチ ファイルの外で使用される場合、単一の % 記号が適切に機能します。
ただし、バッチ ファイル内で使用する場合は、エラーを回避するために、ダブル %% に置き換える必要があります。 また、FOR コマンドのパラメータとして % 記号を含む数値を使用しないことをお勧めします。
バッチ ファイルでの遅延展開の使用
バッチ ファイルで %VARIABLE% を使用すると、結果が出力されないことがあります。 これは、パーセント展開が行われると、実行前、つまり解析時に変数が展開されるためです。
ループ内で使用する場合、変数は 1 回だけ展開されます。
これを解決するには、遅延展開、つまりパーセント記号 (%variable%) の代わりに感嘆符 (!variable!) を使用できます。 遅延展開が有効な場合、変数は実行時に展開されます。
ループでは、ループが繰り返されるたびに展開されます。 したがって、! を使用して変数を展開します。 主にループを使用する場合は、% の代わりに使用することをお勧めします。
遅延展開を有効にするには、次の例に示すように、SETLOCAL EnableDelayedExpansion コマンドを使用して % を ! に置き換えます。
@echo off
setlocal EnableDelayedExpansion
:: count to 5, storing results in a variable
set n=0
FOR /l %%G in (1,1,5) Do (echo [!n!] & set /a n+=1)
echo Total = %n%

出力:

そのため、バッチ ファイルとコマンドで使用する場合の % 記号と %% 記号の違いについて説明しました。 遅延展開の使用を含め、ほぼすべてをカバーしました。