バッチ ファイル内の % と %% の違い
バッチ プログラマーは、バッチ ファイルで使用するときに、単一のパーセント記号 (%
) と二重のパーセント記号 (%%
) を混同することがよくあります。 コマンド ラインで実行する場合、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%
出力:
そのため、バッチ ファイルとコマンドで使用する場合の %
記号と %%
記号の違いについて説明しました。 遅延展開の使用を含め、ほぼすべてをカバーしました。