[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 两个批处理之间参数的传递与变量本地化

现有File1.bat和File2.bat两个批文件,

File1.bat中的代码:
  1. @echo off
  2. rem XXXXXXXXXXXXXXXX File1 XXXXXXXXXXXXXXXX
  3. call File2 100 TestVar
  4. echo.
  5. echo XXXXX最后的输出XXXXX:TestVar=[%TestVar%]
  6. echo.
  7. echo.
  8. echo End&&pause >nul
  9. exit /b
复制代码


File2.bat中的代码:
  1. rem XXXXXXXXXXXXXXXX File2 XXXXXXXXXXXXXXXX
  2. :file2
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. set /a "testA=%~1"
  5. set "testB=%~2"
  6. set /a testA+=100
  7. SETLOCAL DISABLEDELAYEDEXPANSION
  8. endlocal
  9. set "%testB%=%testA%"
  10. echo 过程(File2):[testA=%testA%][testB=%testB%][TestVar=%TestVar%]
  11. set "testA="
  12. set "testB="
  13. goto :eof
复制代码


经过测试,当File2.bat中停用『SETLOCAL ENABLEDELAYEDEXPANSION 』,其结果[TestVar]就可以正常输入,反之不可以,
问题是怎么即使用『SETLOCAL ENABLEDELAYEDEXPANSION 』,又能够得到[TestVar]的值?
研究这个的目的,是想把File2.bat制作成类似C++中的函数,以方便调用,并且能到得到返回值。

回复 2楼 的帖子

版主,你没明白我的意思,我要保留『SETLOCAL ENABLEDELAYEDEXPANSION 』和『SETLOCAL DISABLEDELAYEDEXPANSION』,虽然它们在这个例子中可以省略,我只是拿这个简单的代码为例而已。

TOP

回复 4楼 的帖子

研究了好一会儿你的这段代码,在《File2》的最后一行,有%TestVar%这个变量,并没有任何一处给它定义和赋值,它却能%~2=%TestVar%,而且居然结果正确,不解!
我的初衷,%TestVar%这个变量,是在《File1》中用来接收《File2》的返回值时才用到的变量。

TOP

回复 6楼 的帖子

我的意思是TestVar这个字符串是未知的,是由File2传递进来了,
如果File1中的的批调用改为: call File2 100 Variable ,
岂不是还是更改4楼的File2中最后一行的代码 set %~2=%TestVar% ?

[ 本帖最后由 ibm 于 2009-4-25 21:25 编辑 ]

TOP

回复 8楼 的帖子

由于是两个批的调用与参数传递,供述起来就会有难度,所以没有在群里面讨教,而选择在这里发帖,
endlocal具有“结束批处理文件中环境改动的本地化操作”的功能,但应用上似乎有点问题,
期待问题的解决

TOP

回复 15楼 的帖子
楼上说的没错,File2.bat中不能用到TestVar,因为在设计File2.bat时,还不知道使用File1.bat的人会传递进来什么变量。



回复 9楼 的帖子
在File2.bat结束前加入endlocal,为什么最后TestVar还是会被销毁?

TOP

返回列表