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

[其他] 在批处理脚本中调用 bat 的 exit 问题

本帖最后由 buyiyang 于 2023-5-22 16:50 编辑

先给一个例子,以下分别是1.bat与2.bat的内容
1.bat
  1. 2.bat
  2. echo,第一个脚本
  3. pause
复制代码
2.bat
  1. echo,第二个脚本
复制代码
执行1.bat会发现它闪退了,实际上它只执行了"echo,第二个脚本",然后直接退出了,因为2.bat不会返回,而且bat文件尾默认有一个exit。
看看exit命令的作用:
  1. 退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。
  2. EXIT [/B] [exitCode]
  3.   /B          指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE
  4.   exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码。
复制代码
所以执行完2.bat后就直接退出CMD.EXE了,可以在1.bat中这样解决:
  1. call 2.bat
  2. for /f %%i in ('2.bat') do @
  3. cmd /c 2.bat
复制代码
有时候,有需要在2.bat中显式地写上exit,这时call 2.bat也会直接退出,可以采取后面两种方法。
使用call最好是将exit改成exit /b,或者改为使用goto :eof返回call。

本帖最后由 77七 于 2023-5-22 16:20 编辑

感谢大佬分享!
请问直接在1.bat 里面写另外的批处理 2.bat 是什么用法?好像没多大意义...都要退出cmd我之前见到过 直接写 xxx.exe 相当于有个隐形的call 或者start说法,记不清楚了。
好像和start 和call 效果都不同
我试验了下start /b,结果发现一点奇怪的事
执行
1.bat
  1. @echo off
  2. start /b 2.bat
  3. timeout 1 >nul
  4. echo,第一个脚本1
  5. timeout 1 >nul
  6. echo,第一个脚本2
  7. timeout 1 >nul
  8. echo,第一个脚本3
  9. timeout 1 >nul
  10. pause
复制代码


2.bat 雷同1,除了start
结果
  1. 第二个脚本1
  2. 第二个脚本2
  3. 第一个脚本1
  4. 第二个脚本3
  5. 第一个脚本2
  6. 第一个脚本3
复制代码


发现它们居然是同时执行的.....
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


    我的理解是2.bat与1.bat同一个进程,start是开一个新进程,call调用是开一个子进程。

TOP

返回列表