本帖最后由 applba 于 2011-6-6 16:04 编辑
1.三种调用方式对goto ef的处理
a.cmd为调用者,b.cmd为被调用者,在子目录tmpdir中。
第一种 call调用
用法 call tmpdir\b.cmd
这种用法不会开启新的cmd.exe进程实例。
call调用b.cmd时会获取cmd.exe的控制权,在遇到goto :eof 时会交还控制权,这样cmd.exe可以执行a.cmd中的剩余语句。
第二种 start调用
用法 start tmpdir\b.cmd
这种用法会开启新的cmd.exe进程实例,还可以通过/i来继承调用者的环境变量。
b.cmd在新开启的cmd.exe中运行,基本和a.cmd不相干了。
第三种 直接调用
用法 tmpdir\b.cmd
这种用法和一个普通命令的用法一样,也不会开启新的cmd.exe进程实例。
但是有一个致命的缺陷,只要遇到b.cmd中的 goto :eof,就会导致调用者a.cmd退出。
tmpdir\b.cmd 后面的代码得不到执行,估计是a.cmd把b.cmd中的代码当作自己的代码。
所以总结一下,调用另一个批处理,最合适的是使用call方式。
start调用一般用来调用win32 GUI程序。
直接调用也可以用来调用win32GUI程序。
注意,每个文件末尾都有一个隐含的 :eof或goto :eof。
2、嵌套调用的%CD%的问题。
三个文件 a.cmd调用 b.cmd,b.cmd又调用c.cmd,b和c都位于同一个子目录tmpdir。
a.cmd- @echo off
- echo 当前工作目录是%cd%
- echo.
- pause
- call tmpdir\b.cmd
- pause
复制代码 b.cmd- @echo off
- echo 调用b成功
- echo 当前目录是%cd%
- echo.
- pause
- call c.cmd
复制代码 c.cmd- @echo off
- echo 调用c成功
- echo %cd%
- echo.
- echo 测试完毕
- pause
复制代码 运行上面的a.cmd,b.cmd被正确执行,但是确提示找不到c.cmd,而单独运行b.cmd确可以正常调用.cmd。
通过分析发现,调用b.cmd的时候,%cd%还是a.cmd的,a.cmd同目录下自然没有c.cmd。
好吧,一句话:不管嵌套多少层,%cD%都是最初的调用者的。
解决方法有两个:
1.使用绝对路径,比如 call "%~dp0c.cmd"。
2.切换工作目录,比如在b.cmd的开始或者call b.cmd之前插入pushd %~dp0"。 |