尔游网
您的当前位置:首页关于Bat脚本之间变量共享的若干问题

关于Bat脚本之间变量共享的若干问题

来源:尔游网

关于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块中再次使用到<在该块中赋值的变量>的地方,赋予<该被使用变量>的本身。  (这里有点绕口

因篇幅问题不能全部显示,请点此查看更多更全内容