在批处理文件中打印变量

时间:2015-08-19 17:53:41

标签: windows batch-file

我正在尝试在带括号的代码中打印一个变量,该代码在批处理文件中使用其他变量赋值。

这是我的代码

@echo off
SETLOCAL enableDelayedExpansion
CALL initialize
CALL fun
:fun (
 @echo off
 Setlocal EnableDelayedExpansion
 Set "SOMEVAR=!OTHERVAR!"
 ECHO ..%SOMEVAR%
 EXIT /B 0
)
:initialize (
 set SOMEVAR=somevalue
EXIT /B 0
)

输出只是

..

如何修复它以便我可以为somevar分配值?

Edit1:如果我现在尝试以下列方式进行打印,那就完成了它的工作

ECHO ..!SOMEVAR!

但是我的脚本使用了很多%SOMEVAR%。这是否意味着我需要改变它们?

  

注意:Othervar在其他函数中初始化,如果它被回显,它会显示正确的值。

2 个答案:

答案 0 :(得分:0)

这是否更符合您的期望?请注意,除非使用ENDLOCAL块,否则SOMEVAR不会返回到您的shell环境。

C:>set OTHERVAR=0123456789

C:>type g2.bat
@echo off
SETLOCAL enableDelayedExpansion

CALL:initialize
CALL:fun
EXIT /B 0

:fun (
    rem @echo off
    Setlocal EnableDelayedExpansion
    Set "SOMEVAR=!OTHERVAR!"
    ECHO ..%SOMEVAR%
    GOTO :EOF
)

:initialize (
    set SOMEVAR=somevalue
    GOTO :EOF
)

C:>g2.bat
..0123456789

答案 1 :(得分:0)

由于包含echo %SOMEVAR%的代码部分位于括号之间,因此变量在设置之前会被展开(请参阅this post以获得更好的解释)。

有以下选项可以避免这种情况:

  1. 将其展开为!SOMEVAR!(延迟展开)或
  2. 以避免使用括号:

    @echo off
    SETLOCAL EnableDelayedExpansion
    CALL initialize
    CALL fun
    exit /B
    
    :fun
    Setlocal EnableDelayedExpansion
    Set "SOMEVAR=!OTHERVAR!"
    ECHO ..%SOMEVAR%
    EXIT /B 0
    
    :initialize
    set SOMEVAR=somevalue
    EXIT /B 0
    

    请注意exit /B语句之后的上述代码段中的其他call,以防止无意中落入下面的代码。