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

本文探讨了在Bat脚本中实现变量共享的方法,重点介绍了使用call指令调用子脚本并获取变量值的几种有效方式。通过具体的案例对比,如直接调用与使用call的区别,以及不同环境下变量延迟展开的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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 , 它就是这么做的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值