当前位置: 移动技术网 > IT编程>网络>Dos/Bat > 批处理 延时不完全总结

批处理 延时不完全总结

2017年12月12日  | 移动技术网IT编程  | 我要评论

1、利用ping命令实现延时,方法巧妙而且可以控制,但精度不高。
如:ping -n 3 127.0.0.1>nul大约可以停顿2秒
-n后的数字是发送包的数目,为暂停秒数加一。此法每秒有0.5%的偏差,时间精度为1秒。

@echo off 
@ping 127.0.0.1 -n 6 >nul 
start gdh.txt



2、用vbs脚本中的sleep实现,样本代码如下:
缺点:生成临时文件
优点:时间精度为0.001秒,精度高

例子1、vbs cscript

复制代码 代码如下:

@echo off
echo wscript.sleep wscript.arguments(0) * 1000>delay.vbs
delay.vbs 2
del delay.vbs
echo ok!

例子2、vbs start /wait

@echo off 
echo wscript.sleep 5000>sleep.vbs 
start /wait sleep.vbs 
start gdh.txt 
del /f /s /q sleep.vbs


---------------------------------------
以上程序代码可以实现暂停2秒,2秒过后回显ok!

3、利用“死”循环:设定一个时间差,如果当前时间与设定时间之差不大于设定之时间差,则不退出该循环,从而达到延时的目的。样本代码:
---------------------------------------------------

复制代码 代码如下:

@echo off
set /a start=%time:~6,2%
:prodelay
set /a now=%time:~6,2%
set /a diff=%now%-%start%
rem 以下这一句可以防止秒数从59跳到1时产生的错误。
if %diff% lss 0 set /a diff=%diff%+60
if %diff% leq 2 goto :prodelay
echo ok!

---------------------------------------------
以上程序也可以实现延时2秒的目的。

4:choice
优点:时间精确,cpu占用低,是最佳选择

@echo off 
choice /t 5 /d y /n >nul 
start gdh.txt

5:for+set+if,时间精度为0.01秒
缺点:cpu占用高,语句过长,不常用

@echo off 

setlocal enableextensions 

echo %time% 
call :procdelay 500 
echo %time% 
start gdh.txt 
:procdelay delaymsec_ 
setlocal enableextensions 
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k 
:_procwaitloop 
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k 
set /a diff_=%now_%-%start_% 
if %diff_% lss %1 goto _procwaitloop 
endlocal & goto :eof


6、利用at命令。不过此方法与其说是延时,还不如说成定时的好。
5、

复制代码 代码如下:

@echo off & setlocal enableextensions
echo wscript.sleep 1000 > %temp%.\tmp$$$.vbs
set /a i = 5
:timeout
if %i% == 0 goto next
setlocal
set /a i = %i% - 1
cls
echo dos倒计时程序:alike收集
echo ##################################
echo # #
echo # [%i%]秒后程序开始运行 #
echo # #
echo ##################################
cscript //nologo %temp%.\tmp$$$.vbs
goto timeout
goto end

:next
cls & echo.
for %%f in (%temp%.\tmp$$$.vbs*) do del %%f
start edit boot.ini
exit

下面是其它网友的补充:

【方案一】for+set+if,时间精度为0.01秒,适用平台为winnt/2k/xp/2003。

 利用for解析变量%time%并存为两个时间点%start%和%now%,再利用set /a计算两个时间点的时间差,最后用if判断时间差是否达到设定的暂停时间。

复制代码 代码如下:

@echo off
setlocal enableextensions
echo %time%
call :procdelay 200
echo %time%
goto :eof

:procdelay delaymsec_
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
  :_procwaitloop
  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
  set /a diff_=%now_%-%start_%
if %diff_% lss %1 goto _procwaitloop
endlocal & goto :eof

【方案二】vbs脚本中的sleep函数,时间精度为0.001秒,使用平台为 win9x/winnt系列。

 动态创建一个调用sleep()函数的vbs脚本,然后用windows脚本宿主的命令行版本cscript调用它。

复制代码 代码如下:

@echo off & setlocal enableextensions enabledelayedexpansion
echo wscript.sleep 2000 > %temp%/tmp$$$.vbs
echo %time%
cscript //nologo %temp%/tmp$$$.vbs
echo %time%
for %%f in (%temp%/tmp$$$.vbs) do if exist %%f del %%f
endlocal & goto :eof

【方案三】ping的消息发送间隔,时间精度为1秒,使用平台为 win9x/winnt系列。

 需要你的windows系统中正常安装了网卡的tcp/ip协议,有两种方案,方案二不建议采用,见主题 [讨论]批处理编程的异类 12、13楼:

(1) 利用ping两次发送消息之间的间隔时间。ping在发送多个消息时,在得到上一次消息的回应后,它会再等待1秒的时间才发送下一次消息,而这个回应时间因机型、系统和网络配置而不同,其中ip地址尤其关键,只有本地的回送地址 127.0.0.1 因为是立即回应所以才是相对恒定的,其他地址大多会产生显著的差异。此种方法要等待更大的时间,是指定发送的消息数为等待的时间加一,因为第一个消息是不等待的,ip 地址必须是 127.0.0.1 。其等待2秒的程序如下:

复制代码 代码如下:

::根据植树原则,n后的数字为暂停秒数加一
ping -n 3 127.0.0.1>nul

(2) 利用ping的最大等待时间。ping向0.0.0.1发送一次“网际消息控制协议 (icmp)”回响请求消息,因为 0.0.0.1 是个无法响应 ping 请求的ip地址,所以默认情况下,ping会等待一定的最大响应时间——4秒后便停止等待,而-w可以改变这个每发送一次消息所等待的最大响应时间。而如果将 ip 地址改为立即响应的127.0.0.1或其他响应时间很短的ip ,那 -w 便失去了作用,因为每次发送等待时间都不会达到最大的响应时间,此时延时会缩短。此种方法要等待更大的时间,可以直接使用 -w 指定,但是需要减去一定的发送延时,这个延时需要自己事先测定一下,否则会有不到1秒的误差;而且 ip 地址必须是不响应请求的地址。其等待2秒的程序如下:

复制代码 代码如下:

ping -n 2 -w 500 0.0.0.1>nul

【方案四】choice 的缺省选择等待功能,时间精度为1秒,适用平台为ms-dos/win9x/winnt系列。

/t:y,2 将缺省选择字符设置为y,等待时间是2秒,/n禁止[y,n]提示出现在命令行上,“rem|”的作用是禁止choice从键盘接受按键,从而暂停不会因为按下y或者其它键而被意外终止。

复制代码 代码如下:

rem|choice /t:y,2 /n >nul

【方案五】ascii汇编代码,延迟精度为 0.001秒,适用平台为ms-dos/win9x/winnt。

德国人herbert kleebauer给出了一个通用方案,通过ascii汇编器间接产生一个sleep.exe程序来实现延迟,这个程序分为dos和win两个模块,分别调用dos系统中断服务和windowsapi。

复制代码 代码如下:

:: sleep.bat - sleep/delay/wait n seconds
:: herbert kleebauer(germany) - 2005/05/29
:: modified by will sort - 2005/06/02, 07-25
@echo off
echo q | debug>nul
echo bj@jzh`0x-`/ppppppa(de(dm(do(dh(ls(lu(lx(lezrr]eeeuyrx2dx=>sleep.com
echo 0dxfp,0xx.t0p,=xtgsb4o@$?piyu wwx0gwuy wv;ovbx2gv0exgiuht6>>sleep.com
echo t}{z~~@gwkbg@oekcut`~}@mqqbsy?sehb~_phxr?@zab`lrpeyodt@cj?>>sleep.com
echo pky_jn@qekpet@ij?jysjn@rekpet@jj?jygjn@sekkjtlgunw?p@pjirz>>sleep.com
echo lfvaurq?oyltq@@?~qcool~rdu@?au?@{qoq?@}ikunwpe~fpeqfwh?vkk>>sleep.com
echo _gsqocvh{ojeoseiqrma@knefb?p??mcjnne~b?m??qhetlbgbphexh@e=>>sleep.com
echo esogwtlblk?sfu`?ldod@@k@xo?suuda?_fkj@n?kd@?ua??o}hcqoq??r>>sleep.com
echo _oqol?cla?ceu?_fu?uaq?ubd?loc?oro?uol?uod?ooi?ugl?lor@yuo?>>sleep.com
echo dsmsqswdor[bqaq?lua?_l_ounusclooulooduo?uoe@owh?uoq?djtsdm>>sleep.com
echo qtqrk@kcmsulkpcloouloofuo?hwdtqostdbntqrrdsdftlnbtm`lthkct>>sleep.com
echo @dmtkrqsoddtt~?k?ocoqp?o??gds?wow?pgatachqvnntqv_w?a?it/eh>>sleep.com
echo {zpqpkgk?jbs?fqokoh{t?jpvp@iqbdfan?ohrol?kj??pd~an?ohrod?g>>sleep.com
echo q??pgt~b??oc~?ipo?t?~u?p~cuo0x>>sleep.com
sleep.com>sleep.exe
echo wait %1 seconds:
sleep.exe %1000
del sleep.com
del sleep.exe

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网