Windows批处理:运行另一个批处理文件后变量丢失

时间:2015-06-28 07:57:01

标签: batch-file

我有以下代码:

@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 "是的回应。我查看了调用的批处理文件,但看不到任何明显的代码或设置会导致这种情况。

我想知道是否存在明显的问题。 感谢

1 个答案:

答案 0 :(得分:3)

这里有许多工作要做。

  1. 调试批处理文件时的一些一般性建议:删除顶部的echo off行。当你不压制你的调试信息时,你可以学到很多东西。

  2. 在循环中使用setlocal几乎总是错误的。每次调用都会为环境块的完整副本分配资源,而您没有调用endlocal来解除分配。

  3. 关于变量的回声,我无法重现你描述的行为。当我运行你的代码时,我得到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和文件中的任何内容都不会运行。