bestsource

배치 파일에서 절전 중

bestsource 2023. 6. 18. 16:09
반응형

배치 파일에서 절전 중

Windows 박스에서 무언가를 자동화하기 위해 배치 파일을 작성할 때는 몇 초 동안 실행을 일시 중지해야 했습니다(일반적으로 테스트/대기 루프에서 프로세스가 시작될 때까지 대기).그 때, 제가 찾을 수 있는 최선의 해결책은 원하는 효과를 얻기 위해 핑을 사용하는 것입니다.호출 가능한 "wait.bat"을 설명하는 더 나은 기록을 찾았습니다. 다음과 같이 구현되었습니다.

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

그런 다음 대기 호출을 포함할 수 있습니다.사용자 자신의 배치 파일에서 대기 시간(초)을 지정합니다.

Windows 2003 Resource Kit는 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)

이 명령은 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.

ping요약된 방법은 실행 파일을 추가하거나 다른 소프트웨어를 설치할 수 없을 때(또는 원하지 않을 때) 수행하는 방법입니다.

당신은 거기에 없는 것을 핑하고 있고, 그것을 사용해야 합니다.-w플래그를 지정하여 해당 시간이 경과한 후 오류가 발생하도록 하고, 존재하는 것(localhost 등)을 ping하지 않도록 합니다.-n시간입니다. 이것은 1초 미만의 시간을 처리할 수 있게 해줍니다. 저는 그것이 조금 더 정확하다고 생각합니다.

예.

(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

갱신하다

timeoutWindows Vista 이상에서 사용할 수 있는 명령은 이 질문에 대한 다른 답변에서 설명한 대로 사용되는 명령이어야 합니다.여기서 이어지는 것은 오래된 대답입니다.

구답

Python이 설치되어 있거나 설치에 신경 쓰지 않는 경우(다른 용도도 있음:), 다음 sleep.py 스크립트를 만들어 PATH 어딘가에 추가하면 됩니다.

import time, sys

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

필요한 경우 1.5초, 0.1초 등의 초 단위 일시 중지를 허용합니다.만약 당신이 그것을 다음과 같이 부르고 싶다면.sleepsleep.py그런 다음 추가할 수 있습니다..PYPATHEXT 환경 변수에 대한 확장입니다.Windows XP에서는 다음 위치에서 편집할 수 있습니다.

My Computer → Properties(등록 정보) → Advanced(탭) → Environment Variables(버튼) → System Variables(프레임)

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%)

저는 여기서 찾은 답에 동의하지 않습니다.

일괄 처리 파일에서 지연을 수행하려면 Windows XP 기능을 기반으로 다음 방법을 사용합니다.

지연.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;
}

ping을 사용할 수 있습니다.

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

10초 동안 기다립니다.

당신이 11을 사용해야 하는 이유는 첫 번째 핑이 1초 후가 아니라 바로 꺼지기 때문입니다.이 숫자는 항상 대기할 시간(초)보다 1초 더 커야 합니다.

의 하세요.-w패킷이 전송되는 빈도를 제어하는 것이 아니라 네트워크 문제가 발생한 경우 대기 시간이 얼마 남지 않도록 하기 위한 것입니다.127.0.0.1을 ping하는 경우 문제가 없을 가능성이 높기 때문에 문제가 없을 수 있습니다.

ping명령 자체가 일반적으로 초당 하나의 패킷을 전송합니다.이는 실제로 Windows 문서에 문서화되어 있지 않지만 Linux 버전(문서화되어 있음)과 동일한 규칙을 따르는 것으로 나타납니다.

Server Fault에서도 유사한 질문을 던졌는데, 이에 대한 해결책은 다음과 같습니다.

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

호환성 요구 사항에 따라 다음 중 하나를 사용합니다.ping:

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

예: 5초 동안 기다리려면 사용

ping -n 6 localhost >nul 2>&1

7 에서는 또는윈 7 서에사를 사용합니다.timeout:

timeout 6 >nul

핑을 이용하여 잠을 잘 수 있는 더 좋은 방법이 있습니다.시간 초과를 밀리초 단위로 정확하게 지정할 수 있도록 존재하지 않는 주소를 ping할 수 있습니다. 주소는 ( 3330에 정의되어 , 은 다히도주, 그는표준에 (RFC 3330)은그어, 것행있입니다.192.0.2.x이것은 지어낸 것이 아니라 실제로 존재하지 않는다는 유일한 목적을 가진 주소입니다.분명히 말하면, 이것은 로컬 네트워크에서도 적용됩니다.

192.0.2.0/24 - 이 블록은 문서화 및 예제 코드에 사용하기 위해 "TEST-NET"로 할당됩니다.벤더 및 프로토콜 설명서에서 도메인 이름 example.com 또는 example.net 과 함께 사용되는 경우가 많습니다.이 블록 내의 주소는 공용 인터넷에 표시되지 않아야 합니다.

123밀리초 동안 절전 모드로 전환하려면

업데이트: 댓글에 따르면, 또한 있습니다.127.255.255.255.

시스템에 PowerShell이 있는 경우 다음 명령을 실행하면 됩니다.

powershell -command "Start-Sleep -s 1"

편집: 비슷한 스레드에 대한답변에서 사람들은 파워셸을 시작하는 데 걸리는 시간이 여러분이 기다리려고 하는 시간에 비해 중요하다는 문제를 제기했습니다.대기 시간의 정확성이 중요한 경우(즉, 1~2초의 추가 지연은 허용되지 않음) 다음 방법을 사용할 수 있습니다.

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

이 작업은 윈도우즈 명령이 실행된 시간이 소요되며 파워셸 스크립트는 이 시간 이후 5초까지 대기합니다.따라서 파워셸을 시작하는 데 수면 시간보다 시간이 적게 걸리는 한, 이 접근 방식은 작동할 것입니다(제 컴퓨터에서는 약 600ms).

timeout /t <seconds> <options>

예를 들어 스크립트가 중단되지 않는 2초 대기를 수행하도록 하려면 다음과 같이 하십시오.

timeout /t 2 /nobreak >NUL

즉, 스크립트가 계속하기 전에 2초 동안 기다립니다.

제한을 하므로, "" " " " " " " 를 합니다./nobreak사용자가 대기 시간을 방해하지 않도록 하려면 스위치를 누르십시오.또한 시간 초과는 대기 시간이 얼마나 남았는지 사용자에게 알리기 위해 초당 알림을 제공합니다. 이는 명령어를 파이프로 연결하여 제거할 수 있습니다.NUL.

편집: @martineau댓글에서 지적했듯이,timeout명령은 윈도우즈 7 이상에서만 사용할 수 있습니다. 게가은, 그들다.ping은 명은령보적다프시사간용다니합을서로세은보다 프로세서 합니다.timeout나는 여전히 사용하는 것을 믿습니다.timeout하지만, 가능한 한, 그것이 그것보다 더 읽을 수 있기 때문에.ping'지옥'자세한 내용은 여기를 참조하십시오.

대기할 배치 파일에 이것을 넣어두면 됩니다.

@ping 127.0.0.1 -n 11 -w 1000 > null

메모장에 다음을 기록합니다.

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

이제 대기로 저장합니다.C:\ 폴더에 있는 batWINDOWS\System32를 선택한 후 대기할 때마다 다음을 사용합니다.

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

리소스 키트에는 항상 이 기능이 포함되어 있습니다.적어도 윈도우 2000 이후로.

에는 "Cygwin"이라는 가 있습니다.sleep을 당신의 ▁the▁pl다니킵▁include▁into시를 포함합니다.cygwin.dll(또는 뭐라고 부르든) 그리고 파이팅!

ping의 사용은 "잠시만 기다려" 싶은 한 좋습니다.네트워크가 작동하고 127.0.0.1에서 응답이 없다는 사실과 같은 다른 기능에 의존하기 때문에 실패할 가능성은 매우 낮지만 불가능하지는 않습니다.

이 지정된 시간을 , 해야 합니다.sleep기능(CPU 전원을 사용하지 않거나 네트워크가 준비될 때까지 기다리지 않는다는 이점도 있습니다.)

이미 만들어진 절전 실행 파일을 찾는 것이 가장 편리한 방법입니다.Windows 폴더나 표준 경로의 다른 부분에 놓기만 하면 언제든지 사용할 수 있습니다.

그렇지 않으면 컴파일 환경이 있으면 쉽게 직접 만들 수 있습니다.Sleep은 에서기사수있다니습용할에서 할 수 있습니다.kernel32.dll따라서 당신은 그것을 사용하기만 하면 됩니다. :-) VB / VBA의 경우 소스 시작 부분에서 sleep 기능을 선언하기 위해 다음을 선언합니다.

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

C#의 경우:

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

이 기능(Windows 2000 이후 사용 가능)에 대한 자세한 내용은 MSDN(Sleep 기능)에서 확인할 수 있습니다.

C에서, 표준에 C서,에서,sleep()에서는 이 의 이름이 Visual Studio C로 지정되어 있습니다.Sleep()만약 기억이 나에게 도움이 된다면. ;-) 그 두 사람은 이전의 두 선언처럼 밀리초가 아닌 초 단위로 인수를 받아들입니다.

저는 Aacini의 반응이 좋습니다.나는 하루를 처리하기 위해 그것에 추가했고 또한 그것이 센티초를 처리할 수 있도록 했습니다.%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

저는 이 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");
            }
        }
    }
}

Python 솔루션보다 훨씬 더 가벼운 것은 Perl One-liner입니다.

7초 동안 절전 모드로 전환하려면 BAT 스크립트에 다음을 입력합니다.

perl -e "sleep 7"

이 솔루션은 1초의 해상도만 제공합니다.

를 사용합니다.CPAN의 HiRes 모니다입듈.을 합니다.usleep() 단위로 자는 과 마크로초잠자을고단로위이,자▁which고▁sleeps▁inseconds잠,nanosleep()나노초 단위로 절전 모드를 실행합니다(두 함수 모두 정수 인수만 사용).자세한 내용은 스택 오버플로 문제 Perl에서 밀리초 동안 절전 모드로 전환하는 방법을 참조하십시오.

저는 수년간 액티브 펄을 사용해 왔습니다.이것은 설치하기 매우 쉽습니다.

또는 명령행 Python을 예로 들어 6초 반 동안:

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

Windows 2000 이후의 모든 Windows 버전에서 작동하는 가장 좋은 솔루션은 다음과 같습니다.

timeout numbersofseconds /nobreak > nul

cmd/batch에서 'sleep'을 수행하는 방법은 여러 가지가 있습니다.

내가 가장 좋아하는 것:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

그러면 콘솔이 출력 없이 5초 동안 중지됩니다.

가장 많이 사용되는 항목:

ping localhost -n 5 >NUL 2>NUL

연을시다니합에 .localhost매초마다 새 합니다.컴퓨터에서 호스트되므로 항상 호스트에 연결되므로 매 초마다 새 프로그램을 시도합니다.-nflag는 스크립트가 연결을 시도할 횟수를 나타냅니다.이 경우는 5이므로 5초간 지속됩니다.

마지막 것의 변형:

ping 1.1.1.1 -n 5 >nul

이 스크립트에서는 이전 스크립트와 비교하여 몇 가지 차이점이 있습니다.호출을 시도하지 않습니다.localhost은 대신, 시다니합도을에 입니다.1.1.1.1매우 빠른 웹사이트인터넷에 연결되어 있는 경우에만 작업이 5초간 지속됩니다. 그렇지 않으면 작업을 완료하는 데 약 15회가 소요됩니다.이 방법은 사용하지 않는 것이 좋습니다.

ping 127.0.0.1 -n 5 >nul

이는 예제 2(가장 많이 사용됨)와 정확히 동일합니다.또한 다음을 사용할 수도 있습니다.

ping [::1] -n 5 >nul

IPv6의 파일을 합니다.localhost판본

이 작업을 수행하는 방법은 여러 가지가 있습니다.그러나 Windows Vista 이상 버전의 경우 방법 1을 선호하고 이전 버전의 OS에서는 가장 많이 사용되는 방법 2를 선호합니다.

경로 지정.exe는 2초 미만으로 잘 수 있습니다.

@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

저는 이것이 인상적입니다.

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

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

기술적으로, 당신이 말하고 있습니다.choicey만 허용하는 명령입니다.기본적으로 y로 설정하고, 5초 안에 프롬프트를 표시하지 않으며, Linux의 Null 터미널과 같이 NUL에 명령하는 내용을 덤프합니다.

.vbs 파일을 사용하여 특정 시간 초과를 수행할 수도 있습니다.

아래 코드는 .vbs 파일을 만듭니다.이것을 배치 코드의 맨 위에 놓습니다.

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

그러면 아래 코드가 .vbs를 열고 대기 시간을 지정합니다.

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

위 코드에서 "1000"은 .vbs 파일로 보낼 시간 지연 값입니다(예: 1000ms = 1초).이 부품은 원하는 길이로 변경할 수 있습니다.

아래 코드는 .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"

재미삼아 Node.js가 설치되어 있으면 다음을 사용할 수 있습니다.

node -e 'setTimeout(a => a, 5000)'

5초 동안 잠을 자는 것.노드 v12.14.0이 설치된 Mac에서 작동합니다.

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 XP SP3 및 Windows 7에서 테스트되었으며 CScript를 사용합니다.저는 "델" 프롬프트를 피하기 위해 안전요원들을 배치했습니다.(/q위험할 수 있음)

잠시만요.

sleepOrDelay실행 1000

500ms를 기다린 후 다음 작업을 실행합니다.

sleepOrDelayExecution 500 dir \ /s

sleepOrDelay실행.배트:

@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

다른 사람들이 타사 프로그램(Python, Perl, 사용자 지정 앱 등)을 제안하고 있기 때문에 다른 옵션은 http://gnuwin32.sourceforge.net/packages/coreutils.htm 에서 사용할 수 있는 Windows용 GNU CoreUtils입니다.

배포를 위한 2가지 옵션:

  1. 전체 패키지 설치(전체 CoreUtils, 종속성, 설명서 등 포함)
  2. 'sleep.exe' 바이너리와 필요한 종속성만 설치합니다(사용법은 다릅니다).종속성을 가져오려면 exe)를 입력합니다.

CoreUtils 배포의 한 가지 이점은 스크립트에 유용한 다른 프로그램 호스트를 추가로 얻을 수 있다는 것입니다(Windows 배치에는 부족한 부분이 많습니다).

언급URL : https://stackoverflow.com/questions/166044/sleeping-in-a-batch-file

반응형