【问题标题】:Substitution variables in DOS SETDOS SET 中的替换变量
【发布时间】:2012-05-09 14:57:11
【问题描述】:

我正在尝试在 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

但是我无法让它回显实际输入的值。我已经尝试了回声线上的所有变体。

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

【问题讨论】:

    标签: batch-file environment-variables cmd


    【解决方案1】:

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

    但最好使用延迟扩展,以便像 & 和 | 这样的特殊字符永远不会给你带来麻烦:echo You entered !A%I%!

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

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

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

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

    有用的提示 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
    

    【讨论】:

    • 感谢您的建议。第一个建议 %%A%I%%% 没有奏效。它最终显示:“您输入了 %A1%”、“您输入了 %A2%”等。但是您的第二个建议没有打电话,确实有效。
    • @Neilw - 嗯...CALL echo %%A%I%%% 版本适合我。你确定你把CALL放在你的ECHO之前吗?但无论如何延迟扩展方法更好。
    • 哦,好点。我忘记了 CALL eho。在相关说明中,在您的延迟扩展示例中,我如何允许输入分号和逗号等特殊字符?
    • @Neilw - ????没有什么可做的了。用户可以输入任何字符。使用延迟扩展的 ECHO 可以很好地打印出来。确保不要将 CALL 与延迟扩展技术一起使用。
    • 感谢您的帮助。最后一个障碍:如何将变量与双引号“。例如, SET Q=" IF !Q! equ """ echo YES
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多