遅延展開を使用しているときに、名前に別の変数($project!$project_number!_control
)が含まれている変数のVALUEをecho
しようとしています。これを行うための構文がわかりません。コードは次のとおりです。
@echo off
setlocal enabledelayedexpansion
set $loop_counter=
for %%g in (1,2,3,4,5,6,7,8) do (
set /a $loop_counter+=1
if !$loop_counter! gtr 4 (
echo.
rem echo $loop_counter = !$loop_counter!
set /a $project_number=!$loop_counter!-4
echo $project_number = !$project_number!
set $project!$project_number!_control=Project Description # !$loop_counter!
echo $project!$project_number!_control = !$project!$project_number!_control!
)
)
echo.
pause
echo.
set
echo.
pause
私が問題を抱えているコードの行は、for
ループの最後の行です。
echo $project!$project_number!_control = !$project!$project_number!_control!
具体的には、問題が発生しているのは、$project!$project_number!_control
変数のVALUEをエコーする等号の右側のコードです。 set
コマンド(上記のコードのpause
コマンドの後に実行される)は、値「プロジェクトの説明#5」、「プロジェクトの説明#6」、「プロジェクトの説明#7」を明確に示しています。 、」および「プロジェクトの説明#8」は、対応するproject1_control、project2_control、project3_control、およびproject4_control変数に正しく割り当てられました。
誰かが$project!$project_number!_control
変数の値を表示するために使用する構文を教えてもらえますか?
助けてくれてありがとう!
この問題の解決策は、$project!$project_number!_control
変数は、その値を返すために二重展開を受ける必要があります。以下の元のコードで行ったように、遅延拡張が有効になっている場合、感嘆符を変数で複数回使用することはできません。
!$project!$project_number!_control!
または、上記のように変数の最初と最後に感嘆符を配置する代わりに、次のように変数の最初と最後に二重パーセント記号(%%)を配置する必要があります。
%%$project!$project_number!_control%%
遅延拡張が発生すると、このステートメントは次のように拡張されます。
%$project!$project_number!_control%
上記の展開された変数コードに見られるように、変数のVALUEはまだ返されません。そのためには、2番目の拡張を行う必要があります。 2番目の変数展開を実行するには、call
ステートメントをecho
ループのコードの最後の行の先頭にあるfor
ステートメントの前に配置します。 for
ループの修正されたコードの最後の行は次のとおりです。
call echo $project!$project_number!_control = %%$project!$project_number!_control%%
修正されたコード行でコードが実行されると、すべてが期待どおりに機能します。修正されたコードリスト全体は次のようになります。
@echo off
setlocal enabledelayedexpansion
set $loop_counter=
for %%g in (1,2,3,4,5,6,7,8) do (
set /a $loop_counter+=1
if !$loop_counter! gtr 4 (
echo.
rem echo $loop_counter = !$loop_counter!
set /a $project_number=!$loop_counter!-4
echo $project_number = !$project_number!
set $project!$project_number!_control=Project Description # !$loop_counter!
call echo $project!$project_number!_control = %%$project!$project_number!_control%%
)
)
echo.
pause
echo.
set
echo.
pause
これが、Windowsコマンドの番号付き変数の使用に苦労している人に役立つことを願っています。 call
ステートメントは、遅延拡張が有効になっているときに2番目の拡張を実行するための鍵であることを忘れないでください。