web-dev-qa-db-ja.com

Windowsコマンド-別の数値変数を含む変数の値をエコーする遅延拡張構文

遅延展開を使用しているときに、名前に別の変数($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変数の値を表示するために使用する構文を教えてもらえますか?

助けてくれてありがとう!

2
Bill Vallance

この問題の解決策は、$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番目の拡張を実行するための鍵であることを忘れないでください。

1
Bill Vallance