在Windows批处理程序中实现延时功能

方法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"

你可能感兴趣的:(windows,批处理,运维,Win7,Win10)