python plot图大小 - 睡在一个批处理文件中




legend中文 matplotlib调整图片大小 (25)

您可以通过在标题栏中放置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

当编写一个批处理文件来自动化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资源工具包提供了类似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)

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

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

例如等待5秒钟,使用

ping -n 6 localhost >nul 2>&1

或者在Windows 7或更高版本中使用timeout

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

我一直在使用这个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");
            }
        }
    }
}

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

Here您可以很好地了解睡眠选择(ping方法是最流行的,因为它可以在每台Windows机器上运行),但是(至少)没有提到哪个(ab)使用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

如果你的系统上有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)。


ping -n X 127.0.0.1 > nul

用秒数+ 1替换X.

例如,如果您要等待10秒钟,请将X替换为11.要等待5秒钟,请使用6。

阅读更早的答案为毫秒。


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

你应该ping那些不存在的东西,然后使用-w标志,以便在这段时间后失败,而不是ping那些那里的东西(比如localhost) -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


我对这个印象深刻:

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

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

从技术上讲,你告诉choice命令只接受y。 它默认为y,在5秒钟内完成,不提示任何提示,并转储它对NUL所说的任何内容(如Linux上的null终端)。


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.

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

import time, sys

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

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

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


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

这已在Windows XP SP3和Windows 7上测试过,并使用CScript。 我加入了一些安全警卫以避免提示。 ( /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

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() 。 ;-)这两个参数以秒为单位,而不是以前两个声明的毫秒数。


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

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

我喜欢Aacini的回应 。 我添加到它来处理一天,并使其能够处理centiseconds%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

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

此外,Cygwin软件包还有一个sleep - 放入你的PATH中,并包含cygwin.dll (或其他所谓的)和路径!


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

我完全基于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

您也可以在计算中插入一天,以便在延迟时间间隔经过午夜时方法也可以使用。


我面临类似的问题,但我只是敲了一个非常短的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;
}

比Python解决方案更轻量级的是Perl单线程。

睡七秒钟,把它放在BAT脚本中:

perl -e "sleep 7"

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

如果您需要更高分辨率,请使用CPAN中的Time :: HiRes模块。 它提供usleep() ,其睡眠时间为微秒, nanosleep()睡眠时间为纳秒(这两个函数只接受整数参数)。 查看堆栈溢出问题如何在Perl中睡眠一毫秒? 了解更多详情。

我已经使用ActivePerl很多年了。 安装非常简单。


有更好的方式使用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


或者命令行Python,例如6秒半:

python -c "import time;time.sleep(6.5)"

把它放在你想要等待的批处理文件中。

@ping 127.0.0.1 -n 11 -w 1000 > null

您可以ping一个确实不存在的地址并指定所需的超时时间:

ping 192.0.2.2 -n 1 -w 10000 > nul

由于该地址不存在,它将等待10,000毫秒(10秒)并返回。

  • -w 10000部分以毫秒为单位指定所需的超时时间。
  • -n 1部分告诉ping它应该只尝试一次 (通常它会尝试4次)。
  • > nul部分被追加,所以ping命令不会输出任何内容到屏幕上。

您可以通过在PATH中的某处创建一个sleep.bat并使用上述技巧轻松地创建睡眠命令:

rem SLEEP.BAT - sleeps by the supplied number of seconds

@ping 192.0.2.2 -n 1 -w %1000 > nul

注意: 192.0.2.x地址是按RFC 3330保留的,所以它在现实世界中绝对不会存在。 从规格引用:

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





python batch-file