【问题标题】:batch script echo dynamic variable [duplicate]批处理脚本回显动态变量[重复]
【发布时间】:2018-12-09 18:43:54
【问题描述】:

我的批处理脚本中有一个动态变量,我需要稍后在脚本中使用或打印它,例如

set txt1=hello world
echo %txt1%
set /a num=1
echo %txt%%num%

在此示例的第二行中,结果将为“hello world”,但在最后一行中为 1,如何使最后一行使用动态变量打印“hello world”

【问题讨论】:

  • 我敢打赌,使用这个搜索词[batch-file]动态变量,您会获得更多的点击; take a look.
  • Mmmm...这不是动态变量,而是数组元素,即有几个txt元素是通过数字 indexsubscript 选择。有关批处理文件中阵列管理的详细信息,请参阅this answer。 PS:在批处理文件中动态变量timerandom等。输入set /?并阅读关于“环境动态变量”的部分...

标签: batch-file


【解决方案1】:

不要使用算术表达式将数字字符串分配给环境变量。这在大多数情况下是无用的,尽管总是有效的。所以使用set "num=1" 而不是set /a num=1。原因请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案

有必要让cmd.exe 解析两次最后一个命令行,这可以通过使用延迟扩展或使用命令 CALL 来达到,如How does the Windows Command Interpreter (CMD.EXE) parse scripts? 上的回答中详细解释的那样 p>

使用命令CALL的解决方案:

set "txt1=hello world"
echo %txt1%
set "num=1"
call echo %%txt%num%%%

最后一行首先处理到call echo %txt1%,然后第二次处理,因为命令CALLecho hello world,最终由cmd.exe 执行。

使用delayed expansion的第二种解决方案:

setlocal EnableDelayedExpansion
set "txt1=hello world"
echo %txt1%
set "num=1"
echo !txt%num%!
endlocal

最后一行首先被处理到echo !txt1!,第二次处理是因为在执行批处理文件时环境变量延迟扩展到echo hello world

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • set /?
  • setlocal /?

阅读 this answer 了解有关命令 SETLOCALENDLOCAL 的详细信息。

【讨论】:

  • 非常感谢您的解释,实际上echo !txt%num%!这个命令正是我要找的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2012-01-26
  • 2011-02-10
  • 2017-06-13
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多