バッチ ファイル内の % と %% の違い

Siddharth Bishnoi 2024年2月15日
  1. CMD での %%% の使用
  2. バッチファイルでの %%% の使用
  3. バッチ ファイルでの遅延展開の使用
バッチ ファイル内の % と %% の違い

バッチ プログラマーは、バッチ ファイルで使用するときに、単一のパーセント記号 (%) と二重のパーセント記号 (%%) を混同することがよくあります。 コマンド ラインで実行する場合、FOR コマンドは %f を使用しますが、バッチ ファイルでは、単一のパーセント記号の代わりに %%f を使用します。

シンボル %%%%variable% および !variable! にはいくつかの基本的な違いがあり、コマンド ラインとバッチ ファイルで別々に使用されます。

このチュートリアルでは、バッチ ファイル内の %%% の違いを示します。 また、バッチ ファイルとコマンドでの %%% の使用、および環境変数とループ変数についても説明します。

CMD での %%% の使用

コマンドライン シェルでは、%variable は 1 文字の置き換え可能なパラメーターを指定します。 Ms-DOS は、%1,%2,...,%9 を置換可能なコマンド ライン パラメータとして使用します。つまり、%1 はバッチ ファイルに渡される最初のパラメータに置き換えられます。

次の例は、変数 (%a) を持つ単一のパーセント記号が null 文字として機能することを示しています。

set a="Hello World"
echo %a

CMD で % を使用

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

以下に例を示します。

set a="Hello World"
echo %a%

出力 - CMD で % を使用

バッチファイルでの %%% の使用

バッチ ファイルでは、コマンド ライン シェルはすべてのコマンドを左から右に読み取ります。 パーセント記号を読み取った場合は、次の文字をチェックして続行します。

%% を単一の % として読み取ります。つまり、%% を単一のパーセントで置き換え、3 番目の文字を読み取ります。 FOR ループ内にある場合は、FOR ループ内のように評価されます。

次の例は、FOR ループでの %% の使用を説明しています。

FOR /L %%3 in (1,1,3) Do Echo %%3
PAUSE

for ループでの %% の使用

出力:

出力 - for ループでの %% の使用

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%

遅延展開の使用

出力:

出力 - 遅延展開の使用

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

関連記事 - Batch Command