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)
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)
您也可以在计算中插入日期,以便在延迟时间间隔超过午夜时该方法也可以使用.
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上,您可以在以下位置编辑它:
我的电脑→属性(菜单)→高级(标签)→环境变量(按钮)→系统变量(框架)
mls*_*ves 10
在服务器故障时,问了类似的问题,解决方案是:
choice /d y /t 5 > nul
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
你可以使用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可能不需要它,但旧的习惯很难.
根据您的兼容性需求,使用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)
如果您的系统上装有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)。
使用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
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"黑客" 更具可读性.在这里阅读更多.
只需将它放在您想要等待的批处理文件中.
@ping 127.0.0.1 -n 11 -w 1000 > null
Run Code Online (Sandbox Code Playgroud)