在 Linux 中,我们有 sleep 命令可以使当前运行的脚本等待指定的秒数,如 sleep 5 等待 5 秒。在 Windows 中,我们也有类似的命令可以达到一样的效果,不过需要考虑好这些命令的兼容性,因为并非所有版本的 Windows 都带有这些命令。

首先,我们再来确认一下 Linux 中 sleep 命令的特性:

  • 等待指定的秒数;
  • 等待过程中不会有任何输出;
  • 通过键入 Ctrl + C 来提前结束等待。

下文中的命令示例都以尽可能地达到和 Linux 下的 sleep 一样的效果为目标。

timeout

timeout 命令是自 Windows Server 2003, Windows Vista 起引入的命令:

timeout /t 5 /nobreak > nul

/t 选项指定等待的秒数;

/nobreak 选项使得等待只在输入 Ctrl + C 后提前退出,默认则是按任意键提前退出等待;

> nul 关闭 timeout 的输出,默认会打印出当前剩余的秒数。

缺点

  • timeout 要求执行环境支持输入,即无法在无 console 的环境下使用,否则会报错 ERROR: Input redirection is not supported, exiting the process immediately.
  • 另外,在 Cygwin 环境下,执行 Windows 的 timeout 也会报上述错误,应该使用 coreutils 中的 sleep

sleep (Windows Server 2003 Resource Kit Tools)

Windows Server 2003 Resource Kit Tools 中提供了一个 sleep 命令,基本用法和实际效果与 Linux 中的 sleep 命令相同。

sleep 5

ping

Windows 下的 ping 命令每隔一秒发送一个 ICMP ECHO_REQUEST 包。因此可以利用 ping 命令来近似地模拟等待指定秒数的效果。

ping -n 6 -w 1000 localhost > nul

其中 -n 后指定发送 ECHO_REQUEST 包的数量,也就是我们需要等待的秒数 + 1。需要 + 1 是因为第一个包不经过等待就会被发送。

choice

choice 命令让用户在一系列选项中作出选择,并且可以被设置一个超时时间,因而也可以用来模拟等待。

在 Windows Server 2003, Windows Vista 及之后的版本可用。

choice /T 5 /C X /D X /N > nul

/T 指定用户作出选择前等待的时间;

/C 指定所有有效的选项,/D 指定超时后的默认选项;

/N 不打印有效的选项。

缺点

  • 当用户输入了 /C 参数中指定的选项之一后,等待就会提前结束。

参考