批处理延时
后台执行
#windows/bat/后台执行
使用bat批处理 脚本实现
@echo off
if "%1" == "h" goto begin
start mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
##前四行是隐藏cmd窗口必不可少代码##
##下一句引号中内容【随便写,其语法相当于描述说明】
echo "xxx后台运行脚本"
##下一句 cd 后面跟exe程序的绝对路径 /d 参数使得当前终端路径切换有效
cd /d D:\program files\ssl\
##下一句 start /b 后跟exe程序 【全名】
start /b ssl.exe
如需关闭,请打开运行输入:
taskkill /im cmd.exe
即可关闭
使用vbs脚本实现
CreateObject("WScript.Shell").Run “test.exe",0,FALSE
set ws=WScript.CreateObject("WScript.Shell")
ws.Run "D:\data\\*.exe",0
test.exe 为可执行文件的完全路径名称
批处理延时
使用ping
命令实现延时
-n
指定ping
的次数,每次大概间隔1s,>nul
将ping
过程回显信息给屏蔽ping
命令实现的延时,时间精度:大约1s,内存占用:ping
命令所占用空间- 注意避坑:ping 从第1次发出请求到接收到回显数据几乎是瞬间的,所以你如果想实现10秒的延时,需要设置-n 为11(至少针对ping 127.0.0.1 回环地址是这样),网上很多说需要多少秒,-n参数值就设置多少秒, 真是有些误人子弟呢!
- 我还从网上看到过使用
-w
参数,指定超时等待时间来作为延时时间的,这不是可能,除非指定的地址ping不通,否则这个延时实现根本不可靠
ping 127.0.0.1 -n 11 >nul
使用timeout
命令实现延时
/t
指定等待的描述,有效范围-1
到99999
秒,-1
表示无限期的等待/nobreak
表示忽略按键并等待指定时间,唯一能接收的按键是Ctrl+Z
组合键,如果等待时间未到,按Ctrl+Z
键将终止批处理程序,timeout
后续的命令也不在执行timeout
命令实现的延时,除-1
无限等待外,单次最大延时99999
秒,不过你可以多次调用timeout
命令来实现超过这个限制的延时等待timeout
命令实现的延时,时间精度:大约1s,内存占用:timeout
命令所占用空间
timeout /t 5 /nobreak >nul
使用choice
命令实现延时
/C
指定选项列表,/T
指定做出默认选择之前,等待的时间,可接受的值0-9999
,/D
超过等待时间后,默认选择项;choice
命令实现的延时,单次最大延时9999
秒,不过你可以多次调用choice
命令来实现超过这个限制的延时等待;
3.choice
命令实现的延时,时间精度:大约1s,内存占用:chocie
命令所占用空间
choice /C yn /T 10 /D y >nul
使用for
循环实现延时
使用for
循环也可以实现延时的效果,确切的来说是使用for
循环+ping
/timeout
/choice
组合,来实现延时的效果。
for
+ping
/timeout
/choice
组合的方式,可以灵活的组合出你想要的延时时间,而不受timeout
/choice
单次最大延时的限制;ping
命令想要延时m
秒,则-n
参数值需设置为m+1
,因为首次发出ping
请求到接收到值几乎是瞬时的;- 对于这种组合命令的延时,我建议尽可能将
for
的循环次数设置较小,而循环体内具体实现延时任务的命令对应的参数值设置尽可能大。因为我理解每次循环,相当于重新启动了ping
/timeout
/choice
的程序,而每次启动程序势必会耗费一定的时间,当循环次数较多时,这个启动时间带来的影响将是比较大的。
(在我本地测试,使用for
+ping
组合命令,同样实现100s延时,for
循环1次+ping -n 101
实际耗时大约101s,而for
循环100次+ping -n 2
实际耗时大约102s,后者比前者多出大约1s)
实现100s延时,命令如下:
::for+ping组合
for /l %%i in (1,1,10) do @echo %%i & ping -n 11 127.0.0.1 >nul
::for+timeout组合
for /l %%i in (1,1,10) do @echo %%i & timeout /t 10 >nul
::for+choice组合
for /l %%i in (1,1,10) do @echo %%i & choice /C yn /T 10 /D y >nul
使用sleep
命令实现延时
Windows batch
中没有原生的sleep
命令,需要借助第三方工具。
下载sleep.exe
时间精度:1毫秒
内存占用:sleep命令本身很小
curl https://www.computerhope.com/download/utility/sleep.exe > sleep.exe
将下载好的sleep.exe
程序,放到C:\Windows\System32
或其他在PATH
环境变量中的路径,即可全局使用。
实现延时10s,使用比较简单:
sleep 10
使用VBScript.sleep
实现延时
通过调用vbscript
的方式实现延时功能
- 时间精度:1毫秒;内存占用:vbs脚本本身并不大,执行vbs的
cscript
/wscript
进程大概占用1MB内存;- 调用vbs脚本,还可以使用
wscript
命令,如wscript delay.vbs 1000 >nul
- 需要注意脚本文件和批处理脚本文件的路径问题
1)创建一个vbs脚本文件(如 delay.vbs),内容如下:
WScript.Sleep WScript.Arguments.Item(0)
2)在批处理脚本中调用这个vbscript
,实现延时,在调用delay.vbs脚本时传入参数1000,表示等待1000毫秒,即1秒钟
cscript //nologo delay.vbs 1000 >nul
也可以使用临时vbscript
脚本的方式避免路径问题,即在批处理文件当前路径下生成vbs,用完就删除。具体如下:
echo WScript.Sleep WScript.Arguments.Item(0) > delay.vbs
cscript //nologo delay.vbs 1000 >nul && del delay.vbs
总结
- 除了
sleep.exe
是第三方工具,需要下载安装,其余都是Windows自带的,可以直接使用; - 一般来说,使用
ping
命令或timeout
命令即可,但如果若要获得更精确的延时时间,可以优先考虑VBScript.sleep
方案; - 虽然
ping
命令可能是最常用的,但是当需要延迟的时间较长时,它的误差会越来越多,timeout
/choice
会比它好很多
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hblog!