口頭での説明があっても、サンプル スクリプトの最後の行の評価の順序がよくわかりません。ただし、少なくとも、簡単な例を使用して、目的を達成する方法を示し、状況にその手法を適用する方法を理解できると思います。
%
基本的に、ここでは即時 (または拡張) と遅延の 2 種類の拡張を使用する必要があります。
バッチファイルには適切な遅延展開があり、最初に有効にする必要があり (通常はコマンドをSETLOCAL EnableDelayedExpansion
使用)、次に変数評価!
の代わりに使用します。%
次の例を検討してください。
SET ind=1
SET line%ind%=ABC
SETLOCAL EnableDelayedExpansion
ECHO !line%ind%!
ENDLOCAL
上記の例では、2 つの変数が作成されind
ますline1
。2 番目の名前は、最初の変数を使用して部分的に作成されます。このような変数に値を設定する場合、割り当ての左側の部分である名前を評価する必要がないため、遅延展開は必要ありません。ただし、評価する必要がある場合は、遅延展開を使用する必要があります。上記のスクリプトのECHO
コマンドは次のように機能します。
ほとんどの場合、この種の遅延展開が優先されますが、上記の例では、CALL
-expansion を使用して同じことを実現することもできます。CALL
-expansionを使用するように書き直した同じスクリプト例を次に示します。
SET ind=1
SET line%ind%=ABC
CALL ECHO %%line%ind%%%
基本的に%
ずっと展開がありますが、評価される時期は部分ごとに異なります。2 番目の例の遅延評価がどのように機能するかを次に示します。
展開は遅く、CALL
特にループで現れる可能性があります。一方、展開には、特にコマンドを使用して構文を有効にする!
という事実から生じるいくつかの意味があります。別の質問に対する私の回答には、SETLOCAL
このトピックに関する詳細があります。