Windows Bat实现延时功能的几种常见方式

文章目录

    • [1. 使用`ping`命令实现延时](#1. 使用ping命令实现延时)
    • [2. 使用`timeout`命令实现延时](#2. 使用timeout命令实现延时)
    • [3. 使用`choice`命令实现延时](#3. 使用choice命令实现延时)
    • [4. 使用`for`循环实现延时](#4. 使用for循环实现延时)
    • [5. 使用`sleep`命令实现延时](#5. 使用sleep命令实现延时)
    • [6. 使用`VBScript.sleep`实现延时](#6. 使用VBScript.sleep实现延时)
    • 总结

bat批处理中实现延时功能的几种常用方式

1. 使用ping命令实现延时

使用ping命令可以实现延时的效果,命令如下:

bash 复制代码
ping 127.0.0.1 -n 11 >nul
  1. -n 指定ping的次数,每次大概间隔1s,>nulping过程回显信息给屏蔽
  2. ping命令实现的延时,时间精度:大约1s,内存占用:ping命令所占用空间
  3. 注意闭坑:ping 从第1次发出请求到接收到回显数据几乎是瞬间的,所以你如果想实现10秒的延时,需要设置-n 为11(至少针对ping 127.0.0.1 回环地址是这样),网上很多说需要多少秒,-n参数值就设置多少秒, 真是有些误人子弟呢!
  4. 我还从网上看到过使用-w参数,指定超时等待时间来作为延时时间的,这不是可能,除非指定的地址ping不通,否则这个延时实现根本不可靠

可以通过下边的脚本,验证下-n到底应该设置多少

bash 复制代码
@echo off
echo s_time:%time%
ping -n 1 127.0.0.1 > nul
echo e_time:%time%
echo s_time2:%time%
ping -n 2 127.0.0.1 > nul
echo e_time2:%time%
pause

输出结果:

可以看出,网上那些说【需要延时多少秒,-n就设置多少秒】的人,是有多误人子弟了。不过当-n指定的值越大,最终的延时误差就越大,最终可能也不在乎这1秒的误差了,你可以尝试将-n设置为较大值验证下。

(这个误差实际上与你ping的地址有很大关系)

然后再通过一个脚本,验证下-w参数,对应延时等待是否有效

bash 复制代码
@echo off
echo s_time:%time%
ping -n 10 -w 5000 127.0.0.1 > nul
echo e_time:%time%
pause

按网上错误的说法,这里的结果应该为延时 10*5000/1000=50 秒;从测试结果看,实际上延时大概只有(10-1)秒;-w指定的值未生效,如果你能保证被ping的地址每次都是超时(注意不是ping不通)-w参数指定的时间才会作用到延时效果中

2. 使用timeout命令实现延时

使用timeout命令也可以实现延时的效果,命令如下:

bash 复制代码
timeout /t 5 /nobreak >nul
  1. /t 指定等待的描述,有效范围-199999秒,-1表示无限期的等待
  2. /nobreak表示忽略按键并等待指定时间,唯一能接收的按键是Ctrl+Z组合键,如果等待时间未到,按Ctrl+Z键将终止批处理程序,timeout后续的命令也不在执行
  3. timeout命令实现的延时,除-1无限等待外,单次最大延时99999秒,不过你可以多次调用timeout命令来实现超过这个限制的延时等待
  4. timeout命令实现的延时,时间精度:大约1s,内存占用:timeout命令所占用空间

3. 使用choice命令实现延时

使用choice命令也可以实现延时的效果,命令如下:

bash 复制代码
choice /C yn /T 10 /D y >nul
  1. /C 指定选项列表,/T 指定做出默认选择之前,等待的时间,可接受的值0-9999/D 超过等待时间后,默认选择项;
  2. choice命令实现的延时,单次最大延时9999秒,不过你可以多次调用choice命令来实现超过这个限制的延时等待;
    3.choice命令实现的延时,时间精度:大约1s,内存占用:chocie命令所占用空间

4. 使用for循环实现延时

使用for循环也可以实现延时的效果,确切的来说是使用for循环+ping/timeout/choice组合,来实现延时的效果。

实现100s延时,命令如下:

bash 复制代码
::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
  1. for+ping/timeout/choice组合的方式,可以灵活的组合出你想要的延时时间,而不受timeout/choice单次最大延时的限制;
  2. ping命令想要延时m秒,则-n参数值需设置为m+1,因为首次发出ping请求到接收到值几乎是瞬时的;
  3. 对于这种组合命令的延时,我建议尽可能将for的循环次数设置较小,而循环体内具体实现延时任务的命令对应的参数值设置尽可能大。因为我理解每次循环,相当于重新启动了ping/timeout/choice的程序,而每次启动程序势必会耗费一定的时间,当循环次数较多时,这个启动时间带来的影响将是比较大的。
    (在我本地测试,使用for+ping组合命令,同样实现100s延时,for循环1次+ping -n 101 实际耗时大约101s,而 for循环100次+ping -n 2 实际耗时大约102s,后者比前者多出大约1s)

5. 使用sleep命令实现延时

Windows batch中没有原生的sleep命令,需要借助第三方工具。

下载sleep.exe

bash 复制代码
curl https://www.computerhope.com/download/utility/sleep.exe > sleep.exe

将下载好的sleep.exe程序,放到C:\Windows\System32或其他在PATH环境变量中的路径,即可全局使用。

实现延时10s,使用比较简单:

bash 复制代码
sleep 10

时间精度:1毫秒

内存占用:sleep命令本身很小

6. 使用VBScript.sleep实现延时

在批处理中,可以通过调用vbscript的方式实现延时功能

1)创建一个vbs脚本文件(如 delay.vbs),内容如下:

vbs 复制代码
WScript.Sleep WScript.Arguments.Item(0)

2)在批处理脚本中调用这个vbscript,实现延时

bash 复制代码
cscript //nologo delay.vbs 1000 >nul

表示在调用delay.vbs脚本时传入参数1000,表示等待1000毫秒,即1秒钟。

  1. 时间精度:1毫秒;内存占用:vbs脚本本身并不大,执行vbs的cscript/wscript进程大概占用1MB内存;
  2. 调用vbs脚本,还可以使用wscript命令,如 wscript delay.vbs 1000 >nul
  3. 需要注意脚本文件和批处理脚本文件的路径问题

你也可以使用临时vbscript脚本的方式避免路径问题,具体如下:

bash 复制代码
echo WScript.Sleep WScript.Arguments.Item(0) > delay.vbs
cscript //nologo delay.vbs 1000 >nul && del delay.vbs

即在批处理文件当前路径下生成vbs,用完就删除。

总结

  1. 除了sleep.exe是第三方工具,需要下载安装,其余都是Windows自带的,可以直接使用;
  2. 一般来说,使用ping命令或timeout命令即可,但如果若要获得更精确的延时时间,可以优先考虑VBScript.sleep方案;
  3. 虽然ping命令可能是最常用的,但是当需要延迟的时间较长时,它的误差会越来越多,timeout/choice会比它好很多
相关推荐
cpsvps_net6 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
甄超锋7 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cpsvps9 小时前
美国服务器环境下Windows容器工作负载基于指标的自动扩缩
windows
网硕互联的小客服12 小时前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix12 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享13 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
非凡ghost14 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
mortimer15 小时前
一次与“顽固”外部程序的艰难交锋:subprocess 调用exe踩坑实录
windows·python·ai编程
gameatp17 小时前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
穷人小水滴17 小时前
在 windows 运行 flatpak 应用 (WSL)
linux·windows·ubuntu