方法1:使用PowerShell
@echo off
:: 使用 PowerShell 的 Start-Sleep 命令来实现精确延时
powershell -command "Start-Sleep -Milliseconds 3000"
echo Delay complete.
不过,通常Win7专业版和旗舰版中都会默认安装了PowerShell,但是标准版和家庭版中就没有安装,因此当你碰到Win7系统里没有PowerShell工具时,只能进行手动添加了。具体安装方法请自行百度,本文的重点不在这个。
方法2:ping -n 3 127.1 >nul
实现原理:使用 ping
命令,它会发送网络请求以检查主机的连通性。在这个情况下,-n 3
表示发送3个网络请求,127.1
是本地主机地址,>nul
表示将输出重定向到空设备,即不显示在控制台上。这个命令实际上发送3个网络请求到本地主机,但由于目标地址是本地的回环地址,所以不会有实际网络活动。
但是:受实际网络结构的影响,这个延时功能可能并不理想,有时候只延时了2秒,有时候会超过10秒钟。
方法3:choice /t 3 /d y /n >nul
它在 Windows 中等待用户在一段时间内做出选择。在这个情况下,/t 3
表示等待3秒,/d y
表示默认选择"Y"(Yes),/n
表示不显示选择提示信息,>nul
表示将输出重定向到空设备,即不显示在控制台上。这个命令实际上等待3秒钟,并假定用户选择"Y"(Yes)。
方法4:自己写个函数
@echo off
setlocal enabledelayedexpansion
REM 定义函数:精确延时
:preciseDelay
setlocal
set "targetTime=%~1"
REM 获取当前时间的毫秒表示
for /f "tokens=1-4 delims=:." %%a in ("!time!") do (
set /a "startMS=(((%%a*60+1%%b %% 100)*60+1%%c %% 100)*1000+1%%d %% 1000)"
)
REM 循环检查时间差
:loop
set "currentTime=!time!"
for /f "tokens=1-4 delims=:." %%a in ("!currentTime!") do (
set /a "currentMS=(((%%a*60+1%%b %% 100)*60+1%%c %% 100)*1000+1%%d %% 1000)"
)
set /a "diff=currentMS-startMS"
if !diff! lss %targetTime% (
goto loop
)
endlocal
exit /b
REM 函数结束
REM 调用示例
echo "Start"
call :preciseDelay 3000
echo "End"