我有以下代码:
@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set FILENAME=testfilename
for /L %%n in (1,0,10) do (
echo name-before: !FILENAME!
another-batch-file
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@echo off
echo name-after: !FILENAME!
)
@echo on
ENDLOCAL
运行时,以下内容将回显到控制台:
name-before:testfilename
name-after:!FILENAME!
变量FILENAME
被设置为" testfilename ",并且正确地回显给终端。但是,在另一个批处理文件完成后,无法解析FILENAME
并且" FILENAME "而不是" testfilename "是的回应。我查看了调用的批处理文件,但看不到任何明显的代码或设置会导致这种情况。
我想知道是否存在明显的问题。 感谢
答案 0 :(得分:3)
这里有许多工作要做。
调试批处理文件时的一些一般性建议:删除顶部的echo off
行。当你不压制你的调试信息时,你可以学到很多东西。
在循环中使用setlocal
几乎总是错误的。每次调用都会为环境块的完整副本分配资源,而您没有调用endlocal
来解除分配。
关于变量的回声,我无法重现你描述的行为。当我运行你的代码时,我得到name-before: !FILENAME!
回复。当我使用下面解释的CALL
关键字时,这会正确输出。
我怀疑主要问题是因为您在不使用CALL关键字的情况下调用“another-batch-file”的方式。一般来说,从不想要直接从另一个批处理文件运行批处理文件。第二批完全替换第一批,并且不会运行外批的其他行。实际上,它可以作为EXIT语句使用。
:: This line executes
set foo=1
:: Now run another batch file
other.cmd
:: This line never executes, because this batch was canceled when
:: the other started running
set foo=2
解决方案是使用CALL
关键字运行另一个批处理文件。然后,当前的一个将在完成后继续执行。
:: Now run another batch file
CALL other.cmd
:: This line runs as normal
set foo=2
在你的代码中,很难分辨,因为循环一直持续到当前语句(for /L
)完成运行,但是你的最后一个ENDLOCAL
和文件中的任何内容都不会运行。