Variables 设置未设置变量、范围CMD脚本窗口、例程

Variables 设置未设置变量、范围CMD脚本窗口、例程,variables,batch-file,scope,subroutine,Variables,Batch File,Scope,Subroutine,我想知道如何解决这个问题: rem declaring variable set "vara=" echo vara:%vara% bef call :myroutine echo vara:%vara% aft :routine rem ... rem assing value to variable vara set "vara=34" echo vara was assigned... rem .... echo vara:%vara% exit /b 现在我稍后有这个: vara:

我想知道如何解决这个问题:

rem declaring variable
set "vara="
echo vara:%vara% bef
call :myroutine
echo vara:%vara% aft

:routine
rem ...
rem assing value to variable vara
set "vara=34"
echo vara was assigned...
rem ....
echo vara:%vara%
exit /b
现在我稍后有这个:

vara: bef
vara was assigned
vara:34
vara: aft
我需要使用例程后的值,就像这样

vara: bef
vara was assigned
vara:34
vara:34 aft
瓦拉:34船尾
怎么做?

假设您调用了正确的标签,那么已经发生了这种情况。(:myroutine!=:routine)。您的脚本还有一些其他小问题(在
:routine
之前缺少
goto:EOF
,执行
@echo off
setlocal
)。这里是固定的:

@echo off
setlocal
rem declaring variable
set "vara="
echo vara:%vara% bef
call :routine
echo vara:%vara% aft

set "vara="
goto :EOF

:routine
rem ...
rem assing value to variable vara
set "vara=34"
echo vara was assigned...
rem ....
echo vara:%vara%
exit /b

有关调用子例程/函数的更多信息,请参阅,特别注意有关返回值的不同方法的部分。除非您在
:例程中设置本地

使用goto:EOF exit/b是否有区别,否则您在问题中所描述的内容已经可以正常工作了。使用setlocal有什么好处?对于这个脚本,
goto:EOF
exit/b
之间没有区别。两者之间唯一的真正区别是
退出/b
允许您根据需要将
%ERRORLEVEL%
设置为非零值。有关更多信息,请参阅。使用
setlocal
可以防止脚本使用仅与脚本相关的变量破坏操作环境。如果没有
setlocal
%vara%
将在脚本退出后保持定义状态——或者它将在没有
设置“vara=“
行的情况下保持定义状态。这通常是不受欢迎的,除非是故意的。