DOS SET中的替换变量

时间:2012-05-09 14:57:12

标签: batch-file environment-variables cmd

我试图在DOS CMD脚本中执行此操作:

@setlocal
@for /L %%X in (1,1,10) do @call :label1 %%X
@endlocal
@exit /b

:label1
@set I=%1
@set /P A%I%=SET A%I% to?
@echo You entered %%A%%I%%
exit /b

但是我不能让它回应实际输入的值。我已经尝试了回声线上的所有变化。

谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

要获得输出,您可以使用call echo You entered %%A%I%%%

但最好使用延迟扩展,以便特殊字符如&和|永远不会给你带来问题:echo You entered !A%I%!

要使用延迟展开,您需要使用setlocal enableDelayedExpansion启用它。

有用的提示1 - 将@echo off放在脚本的顶部。然后,您永远不需要在以下任何命令中使用@

有用的提示2 - 在使用SET / P之前,您应该明确清除任何现有的变量值。您无法确定它是否已定义。如果用户只是按<Enter>而不输入任何内容,则会保留现有值。

有用的提示3 - 您甚至不需要I变量。只要%1 {。}},您就可以使用%I%参数。

有用的提示4 - 更好的是,你甚至不需要调用子程序。

@echo off
setlocal enableDelayedExpansion
for /L %%X in (1,1,10) do (
  set "A%%X="
  set /P "A%%X=SET A%%X to? "
  echo You entered !A%%X!
)
endlocal