我的批处理脚本中有一个动态变量,我需要稍后在脚本中使用或打印它,例如
set txt1=hello world
echo %txt1%
set /a num=1
echo %txt%%num%
在本示例的第二行中,结果将是"hello world",但在最后一行中将是1,如何使用动态变量使最后一行打印"hello world“
发布于 2018-07-01 15:39:19
不要使用算术表达式将数字字符串分配给环境变量。这在大多数情况下是无用的,尽管总是有效的。所以使用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
解析两次,这可以通过使用delayed或使用命令CALL来访问,如How does the Windows Command Interpreter (CMD.EXE) parse scripts?上的answer详细说明
使用命令调用解决方案
set "txt1=hello world"
echo %txt1%
set "num=1"
call echo %%txt%num%%%
最后一行首先处理到call echo %txt1%
,然后第二次处理,因为命令调用到echo 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 /?
有关命令SETLOCAL和ENDLOCAL的详细信息,请阅读this answer。
https://stackoverflow.com/questions/51120907
复制相似问题