DOS批处理延时技术

 



举个例子,我们要延时5秒打开gdh.txt这个文件,可以用以下几个方法


方法一:ping 


缺点:时间精度为1秒,不够精确   www.2cto.com  


@echo off 


@ping 127.0.0.1 -n 6 >nul


start gdh.txt



方法二:vbs start /wait


缺点:生成临时文件 


有点:时间精度为0.001秒,精度高


@echo off


echo wscript.sleep 5000>sleep.vbs


start /wait sleep.vbs


start gdh.txt 


del /f /s /q sleep.vbs



方法三:vbs cscript. 


@echo off 


echo wscript.sleep 5000>sleep.vbs


@cscript sleep.vbs >nul


start gdh.txt 


del /f /s /q sleep.vbs


方法四:choice 


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


@echo off 


choice /t 5 /d y /n >nul


start gdh.txt



批处理延时方法小结:


1.ping 


@echo off


:loop


    echo %time%


    ping 127.1 -n 2 1>nul 


    echo %time%


goto loop


内存使用: cmd.exe 1704k


              ping.exe 2920k    


误差评定: 较高


优点:       代码构造简单


缺点:       内存占用高,延迟时间长的话误差相对较大。


2.还是ping 


@echo off


:loop


    echo %time%


    ping 1 -n 1 -w 1000 2>nul 1>nul


    echo %time%


goto loop


内存使用: cmd.exe 1700k


               ping.exe 2912k


误差评定: 一般


优点:        代码构造简单,时间越长误差越小,精确度较高(50ms)


缺点:        内存占用高


3.call 


CODE:   


@echo off


:loop


    echo %time%


    call :delay 1000


    echo %time%


goto loop


:delay


    set /a num=num + 1


    if %num% geq %1 (set num=) && goto :eof


rem    for /l %%i in (1,1,%1) do echo. >nul


goto :eof


内存使用: cmd.exe 1744k [for语句方案]


               cmd.exe 1740k [set+goto方案]


误差评定: 很高 (受CPU频率影响非常大,几乎无法准确把握全局延迟时间)


优点:       精确度较高


缺点:        不适合需精确把握时间的场合


4.msg 


CODE:   


@echo off


:loop


    echo %time%


    msg %username% /time:20 /w "正在延时,点确定可以取消延时!"


    echo %time%


goto loop内存使用: cmd.exe 1752k


               msg.exe 2620k


误差评定: 低


优点:       比较稳定,可中途取消延时,代码构造简单


缺点:        内存占用非常大,有窗口弹出(优点?缺点?)


5.vbs 


CODE:   


@echo off


    echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs


:loop


    echo %time%


    cscript //b //nologo %tmp%\delay.vbs 2000


    echo %time%


goto loop


内存使用: cscript.exe 4812k


               cmd.exe    1708k


误差评定: 很低


优点:        精确度最高,使用更灵活,方便


缺点:        产生临时文件,内存占用多


一个取代choice命令的批处理 (精典)


@echo off && setlocal && cls


:tou


chcp 437 >nul


graftabl 936 >nul


set /p=请选择 [ 回车键 --- 执行A             其它键 --- 执行B ]:<nul


echo exit|cmd/kprompt $_e 100 CD 16 B4 4C CD 21$_g$_|debug>nul


echo.&echo.&echo.


if [%errorlevel%]==[13] ( goto :A ) else ( goto :B )


:A


::按回车符到这里执行


echo 这里是标签: A


echo.


goto :End


:B


::按其它键到这里执行


echo 这里是标签: B


echo.


goto :End


:End


::     用于测试键值的代码段


::     如果希望代替Choice外部命令,则这个代码段可以测试出不同的键值交由%ErrorLevel%判断


echo 所输入的ASCII码键值: %errorlevel%


echo.&echo.&echo.&echo.&echo.&Pause


cls


goto tou


@echo off


:go


cls


echo 计算机将于 17:40 关机


echo 现在时间是 %time% 


echo %time% >time.txt 


find /i "17:48" time.txt >nul


if %errorlevel%==1 goto go 


taskkill /f /im cmd.exe 


exit


实时显示当前时间


@echo off 


echo %time:~0,-3% 


ping -n 2 127.1>nul&cls&%0


::第二行代码说明:“:”和 “~”必不可少!“~”后的数字:为正数表示舍弃输出结果的前几位;直接跟负数表示取到输出结果的后第几位。逗号后的数字:为正数表示取到输出结果的前第 几位;为负数表示舍弃输出结果的后几位。echo %date:~4% echo %time:~-3% echo %date:~4% %time:~0,-3%


现在我有一条路径:c:\​​windows​​\system32\ 


我想删除最后一个字符"\"变为c:\windows\system32 


set "str=c:\windows\system32\" 


echo %str:~0,-1%


逐字显示


@echo off&color 0a&title 做语文老师真不容易 


set /p= <nul


set /p= (alt+数字键盘22为退格键,可在记事本中键入)<nul


for /d %%a in (做 个 语 文 老 师 真 不 容 易 . 以 下 是 学 生 的 造 句 ) do set /p=%%a<nul&ping -n 1 127.1>nul


逐字显示:我是一个中国人


@echo off


for %%a in (我 是 一 个 中 国 人) do ping -n 2 127.0|set /p b=%%a


for /d %%a in (我 是 一 个 中 国 人) do set /p b=%%a<nul&ping -n 1 127.1>nul


::自注set后面的%%a如果添加空格,效果是:我 是 一 个,不加空格,效果是:我是一个


@echo off&setlocal enabledelayedexpansion


set "str=http://bbs.cn-​​dos​​.net"


for /l %%a in (0 1 50) do (


      if "!str:~%%a,1!" neq "" (


          set/p=!str:~%%a,1!<nul


          for /l %%i in (1 1 400) do echo.>nul


         ) else (


         pause>nul&exit/b


     )


)


计划任务设定 


SCHTASKS /Create /SC DAILY /RU administrator /RP HZF /TN HU /SD 2008/11/21 /ST 21:30:00 /TR c:\windows\system32\notepad.exe