睡眠在批处理文件中
在编写批处理文件以使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命令(最后!)。同时,对于仍然使用WindowsXP,Windows 2000或者(不幸的)Windows NT的我们来说,还有更好的方法吗?
我在接受的答案中修改了" sleep.py"脚本,以便如果在命令行上未传递任何参数,则默认为一秒钟:
import time, sys time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
解决方案
资源工具包始终包含此内容。至少从Windows 2000开始。
另外,Cygwin软件包在路径中有一个"睡眠" plop,其中包含" cygwin.dll"(或者任何它所说的名称)和运行方式!
大多数资源工具包中都包含" 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%)
我遇到了类似的问题,但是我只是关闭了一个非常短的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; }
ping的用法很好,只要我们只想"稍等"即可。这是因为我们依赖于下面的其他功能,例如网络正常工作以及127.0.0.1上没有任何应答的事实。 ;-)也许它不太可能失败,但并非不可能...
如果我们想确定自己恰好在指定的时间等待,则应使用"睡眠"功能(它的另一个优点是它不使用CPU电源或者等待网络就绪)。
查找已经制作好的可执行文件以进行睡眠是最方便的方法。只需将其放入Windows文件夹或者标准路径的任何其他部分,它便始终可用。
否则,如果我们具有编译环境,则可以轻松地自己创建一个。
"睡眠"功能在" 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()"。 ;-)这两个参数以秒为单位,而不是前两个声明以毫秒为单位。
如果我们已经安装了Python,或者不介意安装它(它也具有其他用途:),只需创建以下sleep.py脚本并将其添加到PATH中的某个位置即可:
import time, sys time.sleep(float(sys.argv[1]))
如果我们有此需要,它将允许亚秒级的暂停(例如1.5秒,0.1等)。如果我们想将其称为" sleep"而不是" sleep.py",则可以将.PY扩展名添加到PATHEXT环境变量中。在WindowsXP上,我们可以在以下位置对其进行编辑:
我的电脑属性(菜单)高级(选项卡)环境变量(按钮)系统变量(框架)
我一直在使用这个Csleep程序。如果使用我们喜欢的语言,这对我们可能会更方便:
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"); } } } }
Perl比Python解决方案还要轻巧
一线。
要睡眠七秒钟,请将其放在BAT脚本中:
perl -e "sleep 7"
该解决方案仅提供一秒钟的分辨率。
如果需要更高的分辨率,请使用Time :: HiRes
来自CPAN的模块。它提供了" usleep()",它可以在
微秒和" nanosleep()"(以纳秒为单位休眠)
(两个函数都只接受整数参数)。见
StackOverflow问题我如何在Perl中睡眠一毫秒?有关更多详细信息。
我已经使用ActivePerl多年了。这很容易
安装。
我们可以使用ping:
ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:
它将等待10秒钟。
我们必须使用11的原因是因为第一次ping会立即消失,而不是一秒钟后消失。该数字应始终比我们要等待的秒数大一。
请记住,-w的目的不是等待一秒钟。这是为了确保在出现网络问题时,我们等待的时间不超过一秒钟。单独的ping每秒将发送一个ICMP数据包。本地主机可能不需要它,但是旧习惯很难改掉。
在服务器故障处,提出了类似的问题,解决方案是:
choice /d y /t 5 > nul
我们可以使用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");