我正在尝试在带括号的代码中打印一个变量,该代码在批处理文件中使用其他变量赋值。
这是我的代码
@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在其他函数中初始化,如果它被回显,它会显示正确的值。
答案 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以获得更好的解释)。
有以下选项可以避免这种情况:
!SOMEVAR!
(延迟展开)或以避免使用括号:
@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
,以防止无意中落入下面的代码。