我有2个批处理脚本:
sleep1.bat
echo sleep 4 seconds
timeout /t 4
exit
sleep2.bat
echo sleep 3 seconds
timeout /t 3
exit
是否可以连续执行sleep1.bat
和sleep2.bat
,以便程序可以睡7秒钟?
sleepMain.bat
call sleep1.bat
call sleep2.bat
pause
SleepMain.bat
无法做我想做的事。它只执行slee1.bat
,因为sleep1.bat
包含exit
。
sleep1.bat
和sleep2.bat
由其他人撰写,我希望我不必更改它们。
答案 0 :(得分:2)
是的,exit
肯定会退出,但它退出控制台而不是当前的批处理脚本。
为防止发生这种情况,请使用exit /b
。
的提示:强>
- 仅在主脚本中使用
exit
。
- 如果你只是在 sleep1.bat 中做一些简单的事情,你可以选择不添加
醇>exit /b
命令。
自己动手: 1.bat -set "you=you"
, 2.bat -set "you=you" & exit /b
在 3.bat 中,尝试call 1.bat & echo %you%
或call 2.bat & echo %you%
,您仍会获得you
作为输出。这意味着具有exit /b
或无的脚本仍然可以访问先前调用的批处理脚本中的变量。 (安全地尝试使用简单的脚本)
答案 1 :(得分:1)
作为在不退出当前cmd
实例的情况下终止批处理脚本执行的一种改进方法,您不需要像您这样直接的脚本中放置任何内容(只需运行一个命令)在另一个之后,没有执行分支,没有if子句,没有循环结构)。要明确告诉脚本退出执行,您还可以使用goto :EOF
。 :EOF
是一个隐式标签,指向脚本的末尾(在命令提示符中键入goto /?
以获取更多详细信息)。这仅在启用命令扩展时有效,默认情况下就是这种情况(请参阅cmd /?
)。要在没有扩展名的情况下使用此方法,只需将标签:EOF
定义为最后一行即可。
你的两个脚本不会持续4 + 3 = 7秒,但实际上是6到7秒。这是因为timeout
命令以某些第二倍数返回,因此第一个可能更短(0秒>实际延迟时间> = 1秒)。您的脚本中的键盘交互甚至可以中断等待时间;为防止这种情况,请添加/NOBREAK
选项(请参阅timeout /?
获取帮助)。例如,要真正等待4秒,请说明> nul ping 127.0.0.1 -n 5
;给定的IP地址意味着“家”,所以主机本身,因此它总是有效的; 5
定义ping
次尝试的次数,因此其间有4
个1秒的间隔; > nul
将显示输出重定向到nul
设备,这意味着不会显示任何内容。
答案 2 :(得分:0)
这适用于Windows 10:
cmd /c sleep1.bat
cmd /c sleep2.bat
pause
它的工作原理是在单独的命令实例中启动批处理脚本。输出如下:
D:\workspace\deleteme>sleepMain.bat
D:\workspace\deleteme>cmd /c sleep1.bat
D:\workspace\deleteme>echo sleep 4 seconds
sleep 4 seconds
D:\workspace\deleteme>timeout /t 4
Waiting for 0 seconds, press a key to continue ...
D:\workspace\deleteme>exit
D:\workspace\deleteme>cmd /c sleep2.bat
D:\workspace\deleteme>echo sleep 3 seconds
sleep 3 seconds
D:\workspace\deleteme>timeout /t 3
Waiting for 0 seconds, press a key to continue ...
D:\workspace\deleteme>exit
D:\workspace\deleteme>pause
Press any key to continue . . .
D:\workspace\deleteme>