关于Bat脚本之间变量共享的若干问题, 即“ a.bat 调用 b.bat, 之后如何在a.bat中再使用b.bat中赋值的变量”。
我做了个测试,在这里描述下我得出的结果,仅供参考。
Case 1 :
<a.bat>
@echo off
b.bat
echo %b% in a.bat
<b.bat>
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
(注意,这里没有得到%b%, 甚至没有执行到 <a.bat> 中调用b.bat后面的所以行
)
Case 2 :
<a.bat>
@echo off
call b.bat
echo %b% in a.bat
<b.bat>
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
bbb in a.bat
注意到在case 2中, a.bat是通过call b.bat来调用的,所以能够达到使用b.bat中赋值的变量的目的。
再描述下我上次遇到的一种情况:
Case 3:
<a.bat>
@echo off
call b.bat
echo %b% in a.bat
<b.bat>
SETLOCAL ENABLEDELAYEDEXPANSION
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
in a.bat (注意,这里没有得到%b%)
注意到,即使已经用call 来调用b.bat,也没有在a.bat中得到%b%.
我是需要用 SETLOCAL ENABLEDELAYEDEXPANSION, 使得在FOR..DO块中能够使用<在该块中赋值的变量>。
当时的解决方案是:
把b.bat中的操作全部放到了a.bat中,这样就不再有b.bat了,这个解决方案很烂,但是确实解决了问题。
现在发现我的那个CASE有另外两种更好的解决方案:
Solution 1 :
把 SETLOCAL ENABLEDELAYEDEXPANSION 从b.bat 移到a.bat中, 就像这样
<a.bat>
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
call b.bat
echo %b% in a.bat
<b.bat>
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
bbb in a.bat
Solution 2 :
既然是 SETLOCAL ENABLEDELAYEDEXPANSION 带来了问题, 干脆 不使用SETLOCAL ENABLEDELAYEDEXPANSION, 只要在FOR..DO块中再次使用到<在该块中赋值的变量>的地方,赋予<该被使用变量>的本身。 (这里有点绕口
)
感觉是solution 2更加合理,所以最终采用solution 2。 可以参考 http://svn.glority.com/vmscripts/ArtemisViews_DEV/change_SVN_URL.bat , 它就是这么做的。
Case 2 :
<a.bat>
@echo off
call b.bat
echo %b% in a.bat
<b.bat>
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
bbb in a.bat
注意到在case 2中, a.bat是通过call b.bat来调用的,所以能够达到使用b.bat中赋值的变量的目的。
再描述下我上次遇到的一种情况:
Case 3:
<a.bat>
@echo off
call b.bat
echo %b% in a.bat
<b.bat>
SETLOCAL ENABLEDELAYEDEXPANSION
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
in a.bat (注意,这里没有得到%b%)
注意到,即使已经用call 来调用b.bat,也没有在a.bat中得到%b%.
我是需要用 SETLOCAL ENABLEDELAYEDEXPANSION, 使得在FOR..DO块中能够使用<在该块中赋值的变量>。
当时的解决方案是:
把b.bat中的操作全部放到了a.bat中,这样就不再有b.bat了,这个解决方案很烂,但是确实解决了问题。
现在发现我的那个CASE有另外两种更好的解决方案:
Solution 1 :
把 SETLOCAL ENABLEDELAYEDEXPANSION 从b.bat 移到a.bat中, 就像这样
<a.bat>
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
call b.bat
echo %b% in a.bat
<b.bat>
set b=bbb
echo %b% in b.bat
c:/> a.bat
bbb in b.bat
bbb in a.bat
Solution 2 :
既然是 SETLOCAL ENABLEDELAYEDEXPANSION 带来了问题, 干脆 不使用SETLOCAL ENABLEDELAYEDEXPANSION, 只要在FOR..DO块中再次使用到<在该块中赋值的变量>的地方,赋予<该被使用变量>的本身。 (这里有点绕口
感觉是solution 2更加合理,所以最终采用solution 2。 可以参考 http://svn.glority.com/vmscripts/ArtemisViews_DEV/change_SVN_URL.bat , 它就是这么做的。