2014-11-21 63 views
-1

我想知道如何解决这个问题:设置取消设置变量,范围CMD脚本的Windows,例程

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 

翻:后 如何 去做吧?

回答

1

这就是已经发生的情况,假设您调用了正确的标签。 (:myroutine!=:例程)。您的脚本还有一些其他小问题(在:routine之前缺少goto :EOF,并且在做@echo offsetlocal)。这是固定的:

@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 

更多有关调用子程序/函数,见this page,要特别关注的章节关于返回值的不同方法。除非您在:routinesetlocal,否则您在问题中描述的内容已经按照您的要求工作。

+0

有没有区别使用goto:EOF exit/b? 。 。我使用setlocal有什么优势? – Anita 2014-11-21 18:56:40

+0

对于这个脚本,'goto:EOF'和'exit/b'没有区别。两者之间唯一真正的区别是'exit/b'可以让你根据需要设置'%ERRORLEVEL%'为非零值。请参阅[本页](http://www.robvanderwoude.com/exit.php)了解更多信息。使用'setlocal'可以防止您的脚本使用与脚本相关的变量来取消操作环境。如果没有'setlocal','%vara%'将在脚本退出后保持定义状态 - 或者无论如何不会使用'set“vara =”'行。这通常是不受欢迎的,除非有意进行。 – rojo 2014-11-21 19:57:39