睡在批处理文件中

Jas*_*dge 145 python batch-file

当编写批处理文件以在Windows机器上自动执行某些操作时,我需要暂停执行几秒钟(通常在测试/等待循环中,等待进程启动).当时,我能找到的最佳解决方案是使用ping(我不是你的孩子)来达到预期的效果.我发现它的一个更好的写了这里,它描述了一个可调用"wait.bat",实现如下:

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Run Code Online (Sandbox Code Playgroud)

然后,您可以在自己的批处理文件中包含对wait.bat的调用,并传入要休眠的秒数.

显然,Windows 2003资源工具包提供类似Unix的睡眠命令(最后!).与此同时,对于我们这些仍在使用Windows XP,Windows 2000或(可悲的)Windows NT的人来说,还有更好的方法吗?

sleep.py接受的答案中修改了脚本,因此如果在命令行上没有传递参数,则默认为1秒:

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
Run Code Online (Sandbox Code Playgroud)

Blo*_*ard 219

timeout命令可从Windows Vista开始提供:

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1
Run Code Online (Sandbox Code Playgroud)

注意:它不适用于输入重定向 - 一些简单的例子:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.
Run Code Online (Sandbox Code Playgroud)

  • 在无控制台的用途中不起作用:"错误:不支持输入重定向,立即退出进程." (8认同)
  • 由@Cristian Ciupitu添加的`timeout`文档的[link](http://technet.microsoft.com/en-us/library/cc754891.aspx)部分错误 - Windows XP没有这个命令. (3认同)

dan*_*iel 21

使用ping所概述的方法是当我不能(或不想)添加更多可执行文件或安装任何其他软件时如何执行此操作.

你应该查验的东西是不存在的,并使用-w标志,以便它的时间量之后出现故障,无法查验的东西,有(如本地主机)-n倍.这使您可以处理不到一秒的时间,我认为它稍微准确一些.

例如

(不测试1.1.1.1)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL
Run Code Online (Sandbox Code Playgroud)


Luk*_*Luk 15

SLEEP.exe包含在大多数资源工具包中,例如Windows Server 2003 Resource Kit,它也可以安装在Windows XP上.

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)
Run Code Online (Sandbox Code Playgroud)


Aac*_*ini 15

我不同意我在这里找到的答案.

我完全基于Windows XP功能使用以下方法在批处理文件中执行延迟:

DELAY.BAT:

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT
Run Code Online (Sandbox Code Playgroud)

您也可以在计算中插入日期,以便在延迟时间间隔超过午夜时该方法也可以使用.

  • 这应该是准确的,但它是一种CPU密集型的方式.通常,您需要一个中断驱动的实现,以便进程在等待时不会占用CPU周期.这对于不经常的短等待不应该是一个问题,对于大多数批处理情况可能就是这种情况.但是长时间等待的持续运行过程可能会对系统性能产生负面影响. (15认同)
  • 因为它使用系统时钟,精度是一秒.如果指定2秒,延迟可以是2秒到3秒之间的任何时间(实际上是2.99999 ......秒). (4认同)
  • @mrt:问题是你的'%TIME%`使用逗号来分隔厘秒而不是点!只需在`DELIMS =:.,"中添加一个逗号`` (2认同)

Joh*_*bly 13

我遇到了类似的问题,但我只是敲了一个很短的C++控制台应用程序来做同样的事情.只需运行MySleep.exe 1000 - 可能比下载/安装整个资源工具包更容易.

#include <tchar.h>
#include <stdio.h>
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc == 2)
    {
        _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
        Sleep(_tstoi(argv[1]));
    }
    else
    {
        _tprintf(_T("Wrong number of arguments.\n"));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


tzo*_*zot 13

如果您安装了Python,或者不介意安装它(它还有其他用途:),只需创建以下sleep.py脚本并将其添加到PATH中的某个位置:

import time, sys

time.sleep(float(sys.argv[1]))
Run Code Online (Sandbox Code Playgroud)

如果您有此需要,它将允许亚秒级暂停(例如,1.5秒,0.1等).如果要将其称为sleep而不是sleep.py,则可以将.PY扩展名添加到PATHEXT环境变量中.在Windows XP上,您可以在以下位置编辑它:

我的电脑→属性(菜单)→高级(标签)→环境变量(按钮)→系统变量(框架)

  • 为什么我们应该在请求批量脚本化解决方案时在python中编写脚本?路径扩展如何解决Windows用户没有安装python解释器的问题?谢谢. (30认同)
  • 为了便携,我认为应该避免这种解决方案,因为有完美的原生替代品. (5认同)

mls*_*ves 10

在服务器故障时,问了类似的问题,解决方案是:

choice /d y /t 5 > nul
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:Windows XP中不包含选项.它是在Windows 9x中,从XP中删除,并在Vista之后添加回来. (7认同)
  • 我根本不推荐这个.至少在我所知道的所有"CHOICE"版本中,如果有人在等待时按下按钮,有时候不耐烦的人会这样做,那么选择将注册输入,给系统发出嘟嘟声输入错误,并停止倒数计时器,这意味着它会挂在那里,除非他们推N或Y.如果他们碰巧推动其中的一个,那么选择就在那里结束而不是等待5.此外,这个选择使用了非常奇怪的Vista语法.所有正常的选择命令都会使用`CHOICE/T:Y,5> NUL`.旧版本中没有"/ D"标志. (7认同)

Bla*_*ke7 9

您可以使用Windows cscript WSH层和此wait.js JavaScript文件:

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");
Run Code Online (Sandbox Code Playgroud)

  • 不过,可以通过组策略禁用 Windows 脚本主机。 (2认同)

pax*_*blo 8

你可以使用ping:

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:
Run Code Online (Sandbox Code Playgroud)

它将等待10秒.

你必须使用11的原因是因为第一次ping立即熄灭,而不是一秒钟之后.该数字应始终比您要等待的秒数多一个.

请记住,目的-w不是等待一秒钟.这是确保您等待没有更多的一秒中有网络问题的事件.ping它本身将每秒发送一个ICMP数据包.localhost可能不需要它,但旧的习惯很难.

  • @Wael,如果你在谈论等待一秒钟的边界,几毫秒将是无关紧要的.如果你正在使用cmd.exe实时的东西,你应得的一切:-) (12认同)

Joe*_*oey 8

根据您的兼容性需求,使用ping:

ping -n <numberofseconds+1> localhost >nul 2>&1
Run Code Online (Sandbox Code Playgroud)

例如等待5秒钟,使用

ping -n 6 localhost >nul 2>&1
Run Code Online (Sandbox Code Playgroud)

或在Windows 7或更高版本上使用timeout:

timeout 6 >nul
Run Code Online (Sandbox Code Playgroud)

  • `-w`以毫秒为单位,`-n`只是ping的次数,ping之间的默认时间是秒. (2认同)

Nia*_*ton 6

如果您的系统上装有PowerShell,则可以执行以下命令:

powershell -command "Start-Sleep -s 1"
Run Code Online (Sandbox Code Playgroud)

编辑:从我对类似主题的回答中,人们提出了一个问题,即启动Powershell所需的时间与您要等待的时间相比是很重要的。如果等待时间的准确性很重要(即不接受一到两个额外的延迟),则可以使用以下方法:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"
Run Code Online (Sandbox Code Playgroud)

这会花费执行Windows命令的时间,而powershell脚本会休眠直到该时间之后的5秒钟。因此,只要启动Powershell所需的时间少于您的睡眠时间,这种方法就可以工作(在我的机器上大约为600ms)。


maf*_*afu 6

使用ping有一种更好的睡眠方式.您需要ping不存在的地址,因此您可以指定毫秒精度的超时.幸运的是,这样的地址是在标准(RFC 3330)中定义的,它是192.0.2.x.这不是弥补,它实际上是一个地址,其唯一目的是不存在(可能不太清楚,但它甚至适用于本地网络):

192.0.2.0/24 - 该块被指定为"TEST-NET",用于文档和示例代码.它通常与供应商和协议文档中的域名example.com或example.net一起使用.此块中的地址不应出现在公共Internet上.

要睡眠123毫秒,请使用 ping 192.0.2.1 -n 1 -w 123 >nul

  • 根据评论中的讨论[此处](/sf/answers/3980453851/),似乎 192.0.2.1 并不是那么万无一失,有些人建议 127.255.255.255 是更好的选择。想法? (2认同)

mgt*_*s99 6

timeout /t <seconds> <options>
Run Code Online (Sandbox Code Playgroud)

例如,要使脚本执行非不间断的2秒等待:

timeout /t 2 /nobreak >NUL
Run Code Online (Sandbox Code Playgroud)

这意味着脚本将在继续之前等待2秒.

默认情况下,按键会中断超时,因此/nobreak如果您不希望用户能够中断(取消)等待,请使用开关.此外,超时将提供每秒通知以通知用户需要等待多长时间; 这可以通过管道命令删除NUL.

编辑:正如@martineau 在评论中指出的那样,该timeout命令仅适用于Windows 7及更高版本.此外,该ping命令使用的处理器时间少于timeout.timeout尽管如此,我仍然相信在可能的情况下使用,因为它比ping"黑客" 更具可读性.在这里阅读更多.

  • [显然](http://ss64.com/nt/timeout.html)此命令仅适用于Windows 7/2008和XP Resource Kit(可能还有8/8.1).该消息来源还声称`ping`方法使用较少的处理器时间. (2认同)

Bre*_*art 5

只需将它放在您想要等待的批处理文件中.

@ping 127.0.0.1 -n 11 -w 1000 > null
Run Code Online (Sandbox Code Playgroud)

  • 它没有什么不同,但这里的答案来自多个合并的问题,所以当我回复时并不是所有的答案都存在. (2认同)