我正在尝试使用延迟扩展来echo
获取名称包含另一个变量 () 的变量的值$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!
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
而我遇到了麻烦。该set
命令(在上述代码中的命令之后运行pause
)清楚地显示,值“项目描述 #5”、“项目描述 #6”、“项目描述 #7”和“项目描述 #8”已正确分配给相应的 project1_control、project2_control、project3_control 和 project4_control 变量。
有人能告诉我使用什么语法来显示变量的值$project!$project_number!_control
吗?
先谢谢您的帮助!
答案1
这个问题的解决方法是,$project!$project_number!_control
变量必须经过双重扩展才能返回其值。启用延迟扩展时,感叹号不能与变量一起使用多次,就像我在原始代码中所做的那样,如下所示:
!$project!$project_number!_control!
或者像上面所示,在变量的开头和结尾放置感叹号,而应该在变量的开头和结尾放置双百分号(%%),如下所示:
%%$project!$project_number!_control%%
当发生延迟扩展时,此语句将扩展为:
%$project!$project_number!_control%
从上面扩展的变量代码中可以看出,变量的值仍未返回。为此,必须进行第二次扩展。要执行第二次变量扩展,请将语句放在循环中最后一行代码开头的语句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
当启用延迟扩展时,该语句是执行第二次扩展的关键。