2012-05-09 113 views
0

我试图做到这一点在DOS CMD脚本:置换变量SET

@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

要获得输出结果,可以使用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 
+0

感谢您的建议。第一个建议,%% A%I %%%,不起作用。它最终显示:“您输入了%A1%”,“您输入了%A2%”等。但是,您的第二个建议没有通话,确实有效。 –

+0

@Neilw - 嗯...... CALL echo %% A%I %%%'版本适用于我。你确定你把CALL放在你的ECHO之前?但是延迟扩展方法反正更好。 – dbenham

+0

噢好点。我忘了CALL eho。 在相关说明中,在您的delayedexpansion示例中,如何允许输入特殊字符,如分号和逗号? –