睡眠在批处理文件中


151

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

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

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

显然Windows 2003 Resource Kit提供了一个类似Unix的sleep命令(最后!)。同时,对于仍然使用Windows XP,Windows 2000或(不幸的)Windows NT的我们来说,还有更好的方法吗?

sleep.py接受的答案中修改了脚本,以便如果在命令行上未传递任何参数,则默认为一秒钟:

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)

Windows 2003 Resource Kit 的Microsoft 下载页面表明它也适用于XP。恐怕别无选择,只能使用“外部”实用程序进行等待:XP命令处理器中没有内置这样的东西。
GerG

2003服务器资源工具包适用于Windows XP(可能还适用于w2k)
Martin Beckett 2009年

我过去也遇到过同样的问题,并使用ping自我(上面的注释清楚地表明我意识到这很愚蠢:))。
杰克·利奥


2
您有两种选择-使用ping命令模拟睡眠,或下载包含sleep命令的Windows资源工具包。此处有更多详细信息:批处理文件SLEEP命令
Rudu 2011年

Answers:


14

更新

timeout命令,可以从Windows Vista和以后应在命令中使用,如在另一所描述的回答了这个问题。接下来是一个古老的答案。

旧答案

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

import time, sys

time.sleep(float(sys.argv[1]))

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

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


31
当请求可批处理脚本的解决方案时,为什么要在python中编写脚本?路径扩展如何解决Windows用户未安装python解释器的问题?谢谢。
2012年

6
出于可移植性考虑,我认为应避免使用此解决方案,因为存在很好的本机替代方案。
Gras Double

1
过去,这种方法可能提供了一种解决方法,但是@Blorgbeard描述的本机解决方案绝对是可行的方法。
迈克,

227

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

注意:它不适用于输入重定向-简单示例:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.

8
在无控制台的使用中不起作用:“错误:不支持输入重定向,立即退出该过程。”
simpleuser 2013年

我的意思是,你根本就不有一个控制台的情况下,当该批处理文件在后台通过一些其他工艺叉子,一个cygwin的crontab,或远程SSH命令等进行操作,如
simpleuser

1
哦,是的,我知道。我给出的示例只是为了演示错误:)
Blorgbeard在

3
@Cristian Ciupitu添加的指向文档的链接timeout是部分错误的-Windows XP没有此命令。
martineau 2014年

1
@HelloWorld听起来像您的%PATH%的问题
Blorgbeard在

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

立刻返回PING: transmit failed. General failure.
huysentruitw

IP 1.1.1.1是由CloudFlare占用的,因此这不会等待15秒,而是大约数毫秒。
dhcgn

16

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

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

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

您也可以在计算中插入日期,这样,当延迟间隔超过午夜时,该方法也将起作用。


15
这应该是准确的,但这是占用大量CPU资源的方法。通常,您希望使用Interupt驱动的实现,以便该进程在等待时不占用CPU周期。对于不经常的短暂等待,这应该不成问题,对于大多数批处理情况来说可能就是这种情况。但是,长时间运行的连续运行过程可能会对系统性能产生负面影响。
dbenham

4
由于使用系统时钟,因此精度为一秒。如果指定2秒,则延迟可以是2秒至3秒之间的任何时间(实际上是2.99999 ...秒)。
彼得·莫滕森

如果现在时间是7:59:59,而您想等待7秒怎么办?看来它没有考虑到这一点。
ashes999 2012年

这消耗的CPU时间多于计算系统时间。此外,由于八进制数字小于10,因此分钟和秒在TIME命令中以0开头显示。
Andreas

2
@mrt:问题是您%TIME%使用逗号分隔了厘秒,而不是点!只需在DELIMS=:.,"...中添加逗号
Aacini 2015年

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;
}

10

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

choice /d y /t 5 > nul

7
仅供参考:Windows XP中不包括选择。它在Windows 9x中,从XP中删除,然后又添加回Vista。
Devin Burke,

7
我根本不建议这样做。至少在CHOICE我所知道的所有版本中,如果有人在等待时按下了按钮,有时这会让人不耐烦,那么选择将注册一个输入,对错误的输入发出系统提示音,并停止倒数计时器,这意味着它将挂起除非他们按N或Y。如果他们碰巧按了这两个中的一个,那么选择就在那里结束,而不是等待5。而且,这种选择使用的是真正奇怪的Vista语法。所有常规选择命令都将CHOICE /T:Y,5 > NUL用于此目的。/D在旧版本中没有标志。
编码风格为

1
最重要的是,至少我知道的CHOICE命令根据输入的语言具有不同的默认“是/否”按钮,因此,如果您碰巧依赖于默认的[Y,N]选择,而不是使用/C:YN或仅显式地指定它,/C:Y,当某人碰巧拥有瑞典选择命令(默认情况下可能会执行[J,N])时,这将无法正常工作。因此,这陷入了种种麻烦。
编码样式

1
@Coding在Win7中对此进行了测试,如果用户按下按钮,它将发出蜂鸣声,但是在用户按下按钮5秒钟后,它仍然会超时。因此,如果用户持续按下按键,它将永远不会超时。另外,就我而言,当我使用此功能时,我相信可以隐藏控制台,以便用户无法按下按钮。在此系统上,无法访问Python,也无法在系统上删除我自己的exe(如在其他答案中所建议的那样),我只能做些有限的事情。那么,您会推荐什么?
mlsteeves

@mlsteeves每个不同的Windows,DOS等都有不同的选择命令,并且如上所述,它通常在Xp中不可用。许多选择命令的行为略有不同,有些甚至具有不同的语法。我,我通常在需要睡眠时使用ping命令。丑陋,但可靠。
编码风格

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");

1
但是,可以通过组策略禁用Windows脚本宿主。
乔伊

8

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

ping -n <numberofseconds+1> localhost >nul 2>&1

例如等待5秒钟,使用

ping -n 6 localhost >nul 2>&1

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

timeout 6 >nul

2
-w以毫秒为单位,-n仅是ping的次数,而ping之间的默认时间为秒。
乔伊

8

您可以使用ping:

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:

它将等待10秒钟。

您必须使用11的原因是因为第一次ping立即发出,而不是一秒钟后发出。该数字应始终比您要等待的秒数大一。

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


不建议将其用于关键的实时处理。因为正在使用PING命令,所以此WAIT批处理文件可能会运行几毫秒
Wael Dalloul 09年

12
@Wael,如果您正在谈论等待一秒钟的边界,那么几毫秒就无关紧要了。而且,如果您使用cmd.exe进行实时处理,
则应

-w是超时值。它是等待回复的毫秒数…… 而不是两次ping 之间等待的时间。
quux 2011年

@quux,我没有说过-w超时(尽管我承认有些人可能由于我的不清晰而推断出超时),它实际上是用来限制周期时间,在出现网络问题时会导致每个周期占用的时间超过分配的时间第二。我在末尾添加了一个段落来澄清这一点。
paxdiablo

问题是,如果ping返回的速度更快,您可能不会在ping之间等待一整秒。因此您的等待循环将比您
预期的

7

使用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


是的,这比必须在参数中添加一个更容易编写和理解-n
Peter Mortensen

但是,我已经对其进行了测量(使用100 ping)。如果我使用-n 3 -w 124,则实际时间恰好是(3 + 1)*(124 + 1)= 4 * 125 = 500毫秒。计时令人惊讶地稳定,精确到读数中的10 ms分辨率(通过带有时间的CMD提示)-基本分辨率肯定好于10 ms(不受通常的16 ms滴答分辨率影响)。
Peter Mortensen

@mafu不应使用192.0.2.0/24并不意味着不能使用它,因此不能真正保证对echo请求没有答复。例如,为任何Windows PC配置静态IPv4地址192.0.2.1和子网掩码255.255.255.0,然后将网络适配器连接到任何其他设备。一个简单的开关就足够了,没有其他连接。然后ping 192.0.2.1在此Windows PC上运行,可以看到Windows TCP / IP堆栈对回显请求进行了答复。有多少人知道192.0.2.0/24不应用于静态IPv4地址?
Mofi

1
根据此处评论中的讨论,似乎192.0.2.1并不是万无一失的,有人认为127.255.255.255是更好的选择。有什么想法吗?
JLRishe

上面帖子中提到的评论现已删除(可能是NLN),但我同意更改,127.255.255.255因为它是Windows中的广播回送地址,默认情况下已分配给该地址(您可以通过route print在cmd并查看它所打印的IPv4路由表)。
Hoppeduppeanut

6

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

powershell -command "Start-Sleep -s 1"

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

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

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


6
timeout /t <seconds> <options>

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

timeout /t 2 /nobreak >NUL

这意味着脚本将等待2秒再继续。

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

编辑:正如@martineau 在注释中指出的那样,该timeout命令仅在Windows 7及更高版本上可用。此外,该ping命令使用的处理器时间少于timeout。我仍然相信在timeout可能的地方使用它,因为它比ping“ hack” 更具可读性。在这里阅读更多。


2
显然,此命令仅在Windows 7/2008和XP Resource Kit(可能还有8 / 8.1)中可用。消息人士还声称该ping方法使用更少的处理器时间。
martineau 2014年


4

在记事本中,输入:

@echo off
set /a WAITTIME=%1+1
PING 127.0.0.1 -n %WAITTIME% > nul
goto:eof

现在,将另存为wait.bat保存在文件夹C:\ WINDOWS \ System32中,然后每当要等待时,请使用:

CALL WAIT.bat <whole number of seconds without quotes>

它反复ping自身,每次ping之间等待一秒钟,然后返回到调用程序,我看不到无限循环,但我自己进行了测试。
SuperKael 2013年

我的错误,没有无限循环。但是,正如在其他答案之一中提到的那样,最好ping不要只执行一次,-w Timeout而是将选项用于延迟时间(以毫秒为单位),而不要使用-n Count整个重试次数选项。
martineau

-w Timeout可能会更好,但我确定它会比输入的时间多ping一声。
SuperKael

4

资源工具包,始终包含着这一点。至少从Windows 2000开始。

另外,Cygwin软件包sleep在路径中包含一个-plop,并包含cygwin.dll(或任何它所称的)名称和方法!


2
请注意,cygwin1.dll不会与自己的不同版本和平共处。您最好在计算机上只有一个cygwin1.dll,否则您将得到怪异的故障。
JesperE

哪个资源工具包?似乎不止一个。你能更新你的答案吗?
Peter Mortensen

3

我喜欢阿卡尼的回应。我添加了它来处理日期,还使它能够处理厘秒%TIME%输出H:MM:SS.CC):

:delay
SET DELAYINPUT=%1
SET /A DAYS=DELAYINPUT/8640000
SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)

::Get ending centisecond (10 milliseconds)
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
SET /A DAYS=DAYS+ENDING/8640000
SET /A ENDING=ENDING-(DAYS*864000)

::Wait for such a centisecond
:delay_wait
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
SET LASTCURRENT=%CURRENT%
IF %CURRENT% LSS %ENDING% GOTO delay_wait
IF %DAYS% GTR 0 GOTO delay_wait
GOTO :EOF

3

我一直在使用此C#睡眠程序。如果C#是您的首选语言,对您来说可能更方便:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace sleep
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                double time = Double.Parse(args[0]);
                Thread.Sleep((int)(time*1000));
            }
            else
            {
                Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
            }
        }
    }
}

3

Perl一线式甚至比Python解决方案轻巧。

要睡眠七秒钟,请将其放在BAT脚本中:

perl -e "sleep 7"

该解决方案仅提供一秒钟的分辨率。

如果需要更高的分辨率,请使用CPAN中的Time :: HiRes模块。它提供了usleep()哪些睡眠时间(以微秒为单位)和nanosleep()哪些睡眠时间(以纳秒为单位)(两个函数都仅接受整数参数)。请参阅“堆栈溢出”问题。如何在Perl中睡眠一毫秒?有关更多详细信息。

我已经使用ActivePerl多年了。这很容易安装。



2

ping的用法很好,只要您只想“稍等”即可。这是因为您依赖于下面的其他功能,例如您的网络正常工作以及127.0.0.1上没有任何应答的事实。;-)也许它不太可能失败,但并非不可能...

如果要确保正好在指定的时间等待,则应使用该sleep功能(该功能还具有不使用CPU电源或等待网络就绪的优势)。

查找已经制作好的可执行文件以进行睡眠是最方便的方法。只需将其放入Windows文件夹或标准路径的任何其他部分,它便始终可用。

否则,如果您具有编译环境,则可以轻松地自己制作一个。该Sleep功能在中可用kernel32.dll,因此您只需要使用该功能即可。:-)对于VB / VBA,请在源代码的开头声明以下内容以声明睡眠功能:

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

对于C#:

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

您可以在睡眠功能(MSDN)中找到有关此功能(从Windows 2000开始可用)的更多信息。

在标准C中,sleep()包含在标准库中,并且在Microsoft的Visual Studio C中,该函数名为Sleep(),如果内存为我服务。;-)这两个参数以秒为单位,而不是前两个声明以毫秒为单位。


1
睡眠在.net框架中可用-看一下线程类,例如:using System.Threading; .... Thread.Sleep(1000);
John Sible

2
如果“ ping 127.0.0.1”失败,则您需要担心的事情比“睡眠”要严重得多-这是回送接口,任何RPC都可能发疯。
Piskvor于

2

适用于Windows 2000之后的所有Windows版本的最佳解决方案是:

timeout numbersofseconds /nobreak > nul

在XP Pro上不起作用...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau 2014年

1

pathping.exe可以睡少于一秒钟。

@echo off
setlocal EnableDelayedExpansion 
echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!

> sleep 10
17:01:33,57
17:01:33,60

> sleep 20
17:03:56,54
17:03:56,58

> sleep 50
17:04:30,80
17:04:30,87

> sleep 100
17:07:06,12
17:07:06,25

> sleep 200
17:07:08,42
17:07:08,64

> sleep 500
17:07:11,05
17:07:11,57

> sleep 800
17:07:18,98
17:07:19,81

> sleep 1000
17:07:22,61
17:07:23,62

> sleep 1500
17:07:27,55
17:07:29,06

1

我对此印象深刻:

http://www.computerhope.com/batch.htm#02

choice /n /c y /d y /t 5 > NUL

从技术上讲,您是在告诉choice命令仅接受y。它的默认值为y,在5秒钟内这样做,不绘制提示,并将它说的任何内容转储给NUL(例如Linux上的null终端)。


3
我会在这里回应自己:我完全不建议这样做。在CHOICE我所知道的版本中,如果某人在等待时按了某个键,而有时这是急躁的人所做的,那么选择将读取输入,为错误的输入发出系统提示音,并停止倒计时,因此除非他们按Y,否则它将挂起。而且,如果它们恰好按了Y键,那么选择就在那里结束,而不是等待5个。此外,这种选择使用的是真正奇怪的Vista语法。普通的选择命令改为CHOICE /T:Y,5 > NUL用于此目的。(在旧版本中没有/ D标志。)如果您使用的是Vista,请TIMEOUT改用。
编码样式

1

您还可以使用.vbs文件执行特定的超时:

下面的代码创建.vbs文件。将其放在您的rbatch代码顶部附近:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"

然后,下面的代码打开.vbs并指定等待时间:

start /WAIT "" "%cd%\sleeper.vbs" "1000"

在上面的代码中,“ 1000”是要发送到.vbs文件的时间延迟值,以毫秒为单位,例如1000 ms = 1 s。您可以将这部分更改为任意长。

完成后,下面的代码将删除.vbs文件。将其放在批处理文件的末尾:

del /f /q "%cd%\sleeper.vbs"

这是所有代码,因此很容易复制:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
start /WAIT "" "%cd%\sleeper.vbs" "1000"
del /f /q "%cd%\sleeper.vbs"

1

在Windows Vista上,您具有TIMEOUTSLEEP命令,但是要在Windows XP或Windows Server 2003上使用它们,则需要Windows Server 2003资源工具包

在这里,您可以很好地了解其他睡眠方式(ping方法是最受欢迎的方法,因为它可以在每台Windows机器上使用),但是(至少)没有提到(至少)一种使用W32TM(时间服务)命令的睡眠方法:

w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:N  >nul 2>&1

在此处应将N替换为要暂停的秒数。此外,它无需任何先决条件即可在每个Windows系统上运行。

也可以使用Typeperf:

typeperf "\System\Processor Queue Length" -si N -sc 1 >nul

使用mshta和javascript(可在一秒钟内用于睡眠):

start "" /wait /min /realtime mshta "javascript:setTimeout(function(){close();},5000)"

这应该更加精确(等待一秒钟)-自编译可执行文件依赖于.net

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
::del %~n0.exe /q /f
::
:: For precision better call this like
:: call waitMS 500
:: in order to skip compilation in case there's already built .exe
:: as without pointed extension first the .exe will be called due to the ordering in PATEXT variable
::
::
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /w:0 /out:"%~n0.exe" "%~dpsfnx0"
)


%~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Threading;

var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
    Console.WriteLine(arguments[0]+" N");
    Console.WriteLine(" N - milliseconds to wait");
    Environment.Exit(0);    
}

if(arguments.length<2){
    printHelp();
}

try{
    var wait:Int32=Int32.Parse(arguments[1]);
    System.Threading.Thread.Sleep(wait);
}catch(err){
    Console.WriteLine('Invalid Number passed');
    Environment.Exit(1);
}

1

有多种方法可以在cmd / batch中完成“ sleep ”:

我最喜欢的一个:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

这将使控制台停止5秒钟,没有任何输出。

最常被使用:

ping localhost -n 5 >NUL 2>NUL

这将尝试建立localhost5次连接。由于它是托管在您的计算机上的,因此它将始终可以访问该主机,因此,它每秒将尝试新的主机。该-n标志指示脚本将尝试连接多少次。在这种情况下为5,因此它将持续5秒。

最后一个的变体:

ping 1.1.1.1 -n 5 >nul

在此脚本中,与最后一个脚本进行比较存在一些差异。这不会尝试致电localhost。相反,它将尝试连接到1.1.1.1一个非常快速的网站。仅当您具有活动的Internet连接时,此操作才会持续5秒钟否则,它将持续约15分钟才能完成操作。我不建议使用此方法。

ping 127.0.0.1 -n 5 >nul

这与示例2(使用最多)完全相同。另外,您还可以使用:

ping [::1] -n 5 >nul

而是使用IPv6的localhost版本。

有很多方法可以执行此操作。但是,对于Windows Vista和更高版本,我更喜欢方法1,对于较早版本的OS,我更喜欢最常用的方法(方法2)。


0

您可以通过将PAUSE消息放在标题栏中来实现幻想:

@ECHO off
SET TITLETEXT=Sleep
TITLE %TITLETEXT%
CALL :sleep 5
GOTO :END
:: Function Section
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
 %%as&PING.exe -n 2 -w 1000 127.1>NUL)
EXIT /B 0
:: End of script
:END
pause
::this is EOF

0

这已在Windows XP SP3和Windows 7上进行了测试,并使用CScript。我采取了一些安全措施,以免出现del“”提示。(/q很危险)

等待一秒钟:

sleepOrDelayExecution 1000

等待500毫秒,然后在执行以下操作:

sleepOrDelayExecution 500 dir \ /s

sleepOrDelayExecution.bat:

@echo off
if "%1" == "" goto end
if NOT %1 GTR 0 goto end
setlocal
set sleepfn="%temp%\sleep%random%.vbs"
echo WScript.Sleep(%1) >%sleepfn%
if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
cscript %sleepfn% >nul
if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
%params%
:end

0

由于其他人建议使用第三方程序(Python,Perl,自定义应用程序等),因此,另一个可供选择的选择是Windows的GNU CoreUtils,网址http://gnuwin32.sourceforge.net/packages/coreutils.htm

2个部署选项:

  1. 安装完整的软件包(将包括完整的CoreUtils,依赖项,文档等)。
  2. 仅安装“ sleep.exe”二进制文件和必要的依赖项(使用depends.exe获取依赖项)。

部署CoreUtils的一个好处是,您还将获得许多其他有助于编写脚本的程序(Windows批处理还有很多不足之处)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.