एक बैच फ़ाइल में सो रही है


150

जब एक विंडोज़ बॉक्स पर कुछ को स्वचालित करने के लिए एक बैच फ़ाइल लिखी जाती है, तो मुझे कई सेकंड के लिए इसके निष्पादन को रोकना होगा (आमतौर पर परीक्षण / प्रतीक्षा लूप में, प्रक्रिया शुरू होने की प्रतीक्षा में)। उस समय, सबसे अच्छा समाधान मुझे मिल सकता है वांछित प्रभाव को प्राप्त करने के लिए पिंग (मैं आपको बच्चा नहीं) का उपयोग करता हूं। मैंने इसका एक बेहतर लेखन यहां पाया है , जो कि एक कॉल करने योग्य "प्रतीक्षा करें" के बारे में बताता है, जिसे निम्नानुसार लागू किया गया है:

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

फिर आप अपनी खुद की बैच फ़ाइल में प्रतीक्षा करने के लिए कॉल शामिल कर सकते हैं, सोने के लिए सेकंड की संख्या में गुजर रहा है।

जाहिरा तौर पर Windows 2003 संसाधन किट एक यूनिक्स जैसी नींद आदेश (पिछले पर!) प्रदान करता है। इस बीच, हम में से उन लोगों के लिए जो अभी भी 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 संसाधन किट का Microsoft डाउनलोड पृष्ठ इंगित करता है कि यह XP के लिए भी काम करता है। मुझे डर है कि वेटिंग करने के लिए 'बाहरी' यूटिलिटी का उपयोग करने के अलावा और कोई चारा नहीं है: एक्सपी कमांड प्रोसेसर में ऐसा कुछ भी नहीं बनाया गया है।
GerG

2003 सर्वर संसाधन किट विंडोज एक्सपी (और शायद w2k के साथ) के साथ काम करती है
मार्टिन बेकेट

मैंने अतीत में एक ही समस्या का सामना किया था, और खुद को पिंग किया था (ऊपर एक टिप्पणी के साथ स्पष्ट रूप से प्रलेखित कि मुझे एहसास है कि यह बेवकूफ है :))।
जैक लीव जूल 7'09


2
आपके पास कुछ विकल्प हैं - pingकमांड के साथ एक नींद का अनुकरण करें , या विंडोज़ संसाधन किट डाउनलोड करें जिसमें एक sleepकमांड शामिल है । यहाँ अधिक विवरण: बैच फ़ाइल सो कमांड
रुडु

जवाबों:


14

अपडेट करें

timeoutआदेश, विंडोज विस्टा से उपलब्ध और उसके बाद आदेश, इस्तेमाल किया जाना चाहिए किसी अन्य रूप में वर्णित के रूप में इस सवाल का जवाब इस सवाल का। यहाँ निम्नलिखित एक पुराना उत्तर है।

पुराना उत्तर

यदि आपके पास पायथन स्थापित है, या इसे स्थापित करने में कोई आपत्ति नहीं है (इसके अन्य उपयोग भी हैं :), बस निम्नलिखित स्लीप थ्रू स्क्रिप्ट बनाएं और इसे अपने पेट में कहीं जोड़ें:

import time, sys

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

यह उप-दूसरे ठहराव की अनुमति देगा (उदाहरण के लिए, 1.5 सेकंड, 0.1, आदि), क्या आपको ऐसी आवश्यकता होनी चाहिए। यदि आप इसके sleepबजाय इसे कॉल करना चाहते हैं sleep.py, तो आप .PYएक्सटेंशन को अपने पथ पर्यावरण चर में जोड़ सकते हैं । Windows XP पर, आप इसे इसमें संपादित कर सकते हैं:

मेरा कंप्यूटर → गुण (मेनू) → उन्नत (टैब) → पर्यावरण चर (बटन) → सिस्टम चर (फ्रेम)


32
जब हम बैच-स्क्रिप्ट योग्य समाधान का अनुरोध करते हैं तो हमें अजगर में एक स्क्रिप्ट क्यों लिखनी चाहिए? पथ विस्तार इस समस्या को कैसे हल कर सकता है कि विंडोज उपयोगकर्ताओं के पास कोई अजगर इंटरप्रेटर स्थापित नहीं है? धन्यवाद।
वैल

6
पोर्टेबिलिटी के लिए, मुझे लगता है कि इस समाधान से बचना चाहिए क्योंकि पूरी तरह से ठीक देशी विकल्प हैं।
ग्रास डबल

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
कंसोल-कम उपयोगों में काम नहीं करता है: "त्रुटि: इनपुट पुनर्निर्देशन समर्थित नहीं है, प्रक्रिया से तुरंत बाहर निकलता है।"
साधारण राह

मेरा मतलब था कि ऐसे मामले जहां आपके पास कोई सांत्वना नहीं है, जैसे कि जब बैच फ़ाइल को किसी अन्य प्रक्रिया से कांटे के माध्यम से पृष्ठभूमि में चलाया जाता है, तो एक
साइबरविन क्रॉस्टैब

1
अरे हाँ मुझे पता है मैंने जो उदाहरण दिया वह सिर्फ त्रुटि प्रदर्शित करने के लिए था :)
ब्लोर्बर्गर

3
@Cristian Ciupitu द्वारा जोड़ा गया दस्तावेज़ीकरण का लिंकtimeout आंशिक रूप से गलत है - Windows XP में यह कमांड नहीं है।
मार्टिउ

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 द्वारा लिया गया है, इसलिए यह 15s पर नहीं बल्कि कुछ ms के आस-पास प्रतीक्षा करेगा।
dhcgn

16

SLEEP.exeअधिकांश संसाधन किटों में शामिल है जैसे विंडोज सर्वर 2003 संसाधन किट जिसे विंडोज एक्सपी पर भी स्थापित किया जा सकता है।

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
यह सटीक होना चाहिए, लेकिन इसके बारे में जाने के लिए यह एक सीपीयू गहन तरीका है। आम तौर पर आप एक इंटरप्टेड संचालित कार्यान्वयन चाहते हैं ताकि यह प्रक्रिया इंतजार करते समय सीपीयू चक्रों का उपभोग न करे। यह अक्सर कम वेटिंग के लिए एक समस्या नहीं होनी चाहिए, जैसा कि ज्यादातर बैच स्थितियों के लिए होता है। लेकिन लंबे इंतजार के साथ लगातार चलने वाली प्रक्रिया सिस्टम के प्रदर्शन पर नकारात्मक प्रभाव डाल सकती है।
denham

4
जैसा कि यह सिस्टम घड़ी का उपयोग करता है सटीकता एक सेकंड है। यदि 2 सेकंड निर्दिष्ट है, तो देरी 2 सेकंड और 3 सेकंड (वास्तव में 2.99999 ... सेकंड) के बीच कुछ भी हो सकती है।
पीटर मोर्टेंसन

क्या होगा अगर समय अब ​​7:59:59 है और आप 7 सेकंड इंतजार करना चाहते हैं? ऐसा लगता है कि यह उस पर ध्यान नहीं देता है।
ashes999

यह सिस्टम समय की तुलना में अधिक सीपीयू समय की खपत करता है। इसके अलावा, आप अष्टक संख्याओं के साथ अंकगणितीय संचालन कर रहे हैं, क्योंकि 10 और मिनट 10 सेकंड से छोटे TIMEकमांड में एक अग्रणी 0 के साथ प्रदर्शित होते हैं ।
एंड्रियास

2
@ आर्ट: समस्या यह है कि आपका %TIME%कॉमा एक बिंदु के बजाय सेंटीसेकंड को अलग करने के लिए उपयोग करता है! बस एक अल्पविराम जोड़ें DELIMS=:.,"...
Aacini

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
FYI करें: पसंद Windows XP में शामिल नहीं है। यह विंडोज 9x में था, जिसे एक्सपी से हटा दिया गया था, और विस्टा के लिए वापस जोड़ा गया।
डेविन बर्क

7
मैंने इसकी बिल्कुल भी सिफारिश नहीं की है। कम से कम सभी CHOICEसंस्करणों में मुझे पता है, अगर कोई प्रतीक्षा करते समय एक बटन दबाता है, जो अधीर लोग कभी-कभी करते हैं, तो पसंद एक इनपुट दर्ज करेगा, एक खराब इनपुट के लिए एक सिस्टम बीप देगा, और उलटी गिनती टाइमर को रोक देगा, जिसका अर्थ है कि यह लटका होगा। जब तक वे एन या वाई को धक्का नहीं देते हैं और यदि वे उन दो में से एक को धक्का देने के लिए होते हैं, तो विकल्प 5 के इंतजार के बजाय वहीं समाप्त हो जाता है। इसके अलावा, यह पसंद वास्तव में अजीब विस्टा सिंटैक्स का उपयोग कर रही है। सभी सामान्य पसंद कमांड इसके बजाय उपयोग CHOICE /T:Y,5 > NULकरेंगे। /Dपुराने संस्करणों में कोई ध्वज नहीं है ।
स्टाइल

1
इसे बंद करने के लिए, कम से कम CHOICE कमांड के बारे में मुझे पता है कि यह जिस भाषा में आई है, उसके आधार पर अलग-अलग डिफ़ॉल्ट हां / नहीं बटन हैं, इसलिए यदि आप एक डिफ़ॉल्ट [Y, N] विकल्प पर भरोसा करने के बजाय इसे स्पष्ट रूप से निर्दिष्ट कर रहे हैं /C:YNया सिर्फ /C:Y, यह तब काम करने वाला नहीं है जब कोई ऐसा होता है, कहते हैं, स्वीडिश पसंद कमांड, जो संभवत: डिफ़ॉल्ट रूप से [जे, एन] करेगा। तो यह सभी प्रकार की परेशानी में निहित है।
स्टाइल

1
@Coding ने Win7 में इसका परीक्षण किया, और यदि उपयोगकर्ता एक बटन दबाता है, तो वह बीप करेगा, हालांकि उपयोगकर्ता द्वारा एक बटन दबाए जाने के बाद यह 5 सेकंड के बाद भी समय समाप्त हो जाएगा। इसलिए यदि उपयोगकर्ता चाबियाँ दबाए रखता है, तो यह कभी भी समाप्त नहीं होगा। इसके अलावा, मेरे मामले में, जब मैंने इसका उपयोग किया, तो मेरा मानना ​​है कि कंसोल को छिपाएं, ताकि उपयोगकर्ता बटन दबा न सके। इस प्रणाली पर, पायथन तक कोई पहुंच नहीं थी, सिस्टम पर अपने स्वयं के निर्वासन को छोड़ने के लिए कोई पहुंच नहीं थी (जैसा कि कुछ अन्य उत्तरों में सुझाव दिया गया है), मैं जो कुछ भी कर सकता था उसमें मैं बहुत सीमित था। तो, आप क्या सुझाएंगे?
मिलीलीटर

@mlsteeves हर अलग विंडोज, डॉस, आदि में एक अलग पसंद कमांड है और जैसा कि यह सामान्य रूप से एक्सपी में उपलब्ध नहीं है। कई पसंद कमांड में अलग-अलग व्यवहार होता है और कुछ में अलग-अलग वाक्य-विन्यास भी होता है। मुझे, मैं आमतौर पर पिंग कमांड का उपयोग करता हूं जब मुझे नींद की आवश्यकता होती है। यह बदसूरत है, लेकिन विश्वसनीय है।
स्टाइलिंग के साथ कोडिंग

9

आप Windows सीएससी WSH परत और इस प्रतीक्षा का उपयोग कर सकते हैं। जावास्क्रिप्ट जावास्क्रिप्ट फ़ाइल:

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

या विंडोज 7 या बाद के उपयोग पर timeout:

timeout 6 >nul

2
-wमिलीसेकंड में है, -nपिंग करने के लिए बस की संख्या है और पिंग्स के बीच डिफ़ॉल्ट समय एक दूसरा है।
जोए

8

आप पिंग का उपयोग कर सकते हैं:

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

यह 10 सेकंड प्रतीक्षा करेगा।

11 का उपयोग करने का कारण यह है कि पहला पिंग तुरंत निकल जाता है, एक सेकंड के बाद नहीं। संख्या हमेशा सेकंड की संख्या से अधिक होनी चाहिए जिसका आप इंतजार करना चाहते हैं।

ध्यान रखें कि इसका उद्देश्य -wएक सेकंड इंतजार नहीं करना है। यह सुनिश्चित करना है कि आप इस घटना में एक सेकंड से अधिक नहीं रुकें कि नेटवर्क समस्याएं हैं। pingअपने आप ही प्रति सेकंड एक ICMP पैकेट भेजेगा। यह शायद लोकलहोस्ट के लिए आवश्यक नहीं है, लेकिन पुरानी आदतें कठिन मर जाती हैं।


यह महत्वपूर्ण वास्तविक समय प्रसंस्करण के लिए इसका उपयोग करने के लिए अनुशंसित नहीं है। क्योंकि पिंग कमांड का उपयोग किया जा रहा है, इसलिए यह संभव है कि यह WAIT बैच की फाइल कुछ मिलीसेकंड से अधिक हो सकती है
वेल डैलौल

12
@ यदि आप एक-दूसरे की सीमाओं पर प्रतीक्षा करने की बात कर रहे हैं, तो कुछ मिलीसेकंड अप्रासंगिक होंगे। और अगर आप realtime सामान के लिए cmd.exe का उपयोग कर रहे हैं, तो आप सब कुछ पाने के लायक हैं :-)
paxdiablo

-w एक टाइमआउट मान है। यह उत्तर के लिए प्रतीक्षा करने के लिए मिलीसेकंड की संख्या है ... पिंग के बीच प्रतीक्षा करने के लिए समय की मात्रा नहीं
quux

@quux, कहीं भी नहीं था कि मैं -wटाइमआउट था (हालांकि मैं मानता हूं कि कुछ लोग मेरी कमी के कारण समझ सकते हैं), यह वास्तव में साइकिल के समय को सीमित करने के लिए उपयोग किया जाता है जहां नेटवर्क समस्याएं हैं जो प्रत्येक चक्र को इसके आवंटित से अधिक लेने का कारण बनेगी दूसरा। मैंने इसे स्पष्ट करने के लिए एक पैराग्राफ जोड़ा है।
paxdiablo

मुद्दा यह है कि अगर पिंग तेजी से लौटते हैं , तो आप पिंग्स के बीच एक दूसरे का इंतजार नहीं कर सकते। तो अपने प्रतीक्षा पाश से अधिक तेजी से आप सोचा खत्म हो जाएगा यह होगा
quux

7

पिंग का उपयोग करके सोने का एक बेहतर तरीका है। आप एक ऐसे पते को पिंग करना चाहते हैं जो मौजूद नहीं है, इसलिए आप मिलीसेकंड परिशुद्धता के साथ एक टाइमआउट निर्दिष्ट कर सकते हैं। सौभाग्य से, ऐसा पता एक मानक (आरएफसी 3330) में परिभाषित किया गया है, और यह है 192.0.2.x। यह बना-बनाया नहीं है, यह वास्तव में मौजूदा नहीं के एकमात्र उद्देश्य के साथ एक पता है (यह स्पष्ट नहीं हो सकता है, लेकिन यह स्थानीय नेटवर्क में भी लागू होता है):

192.0.2.0/24 - इस ब्लॉक को प्रलेखन और उदाहरण कोड में उपयोग के लिए "टेस्ट-नेट" के रूप में सौंपा गया है। इसका उपयोग अक्सर वेंडर और प्रोटोकॉल डॉक्यूमेंट में डोमेन नाम example.com या example.net के संयोजन में किया जाता है। इस ब्लॉक के पते सार्वजनिक इंटरनेट पर प्रदर्शित नहीं होने चाहिए।

123 मिलीसेकेंड के लिए सोने के लिए, का उपयोग करें ping 192.0.2.1 -n 1 -w 123 >nul


हाँ, यह लिखने और करने के लिए की तुलना में समझने के लिए आसान है एक जोड़ने के लिए -nपैरामीटर।
पीटर मॉर्टेंसन

हालांकि, मैंने इसे (100 पिंग्स का उपयोग करके) मापा है। यदि मैं 3 -w 124 का उपयोग करता हूं, तो वास्तविक समय बिल्कुल (3 + 1) * (124 + 1) = 4 * 125/500 एमएस है। समय आश्चर्यजनक रूप से स्थिर है, रीडआउट में 10 एमएस संकल्प के लिए सटीक है (समय के साथ एक सीएमडी संकेत द्वारा) - और अंतर्निहित संकल्प निश्चित रूप से 10 एमएस से बेहतर है (सामान्य 16 एमएस टिक संकल्प से प्रभावित नहीं)।
पीटर मोर्टेंसन

@ mafu कि 192.0.2.0/24 का उपयोग नहीं किया जाना चाहिए इसका मतलब यह नहीं है कि इसका उपयोग नहीं किया जा सकता है और इसलिए यह वास्तव में गारंटी नहीं है कि गूंज अनुरोध (ओं) पर कोई जवाब नहीं है। उदाहरण के लिए किसी भी विंडोज पीसी के लिए स्थिर आईपीवी 4 पता 192.0.2.1 और सबनेट मास्क 255.255.255.0 को कॉन्फ़िगर करें और नेटवर्क एडेप्टर को किसी अन्य डिवाइस से कनेक्ट करें। एक साधारण स्विच पर्याप्त है जिस पर और कुछ नहीं जुड़ा है। फिर ping 192.0.2.1इस विंडोज पीसी पर चलाएं और यह देखा जा सकता है कि विंडोज टीसीपी / आईपी स्टैक गूंज अनुरोधों पर जवाब देता है। कितने लोग जानते हैं कि स्थिर IPv4 पते के लिए 192.0.2.0/24 का उपयोग नहीं किया जाना चाहिए?
मोफी जूल

1
यहाँ टिप्पणियों में चर्चा के अनुसार , ऐसा लगता है कि 192.0.2.1 यह सब मूर्खतापूर्ण नहीं है और कुछ सुझाव दे रहे हैं कि 127.255.255.255 एक बेहतर विकल्प है। विचार?
JLRishe

टिप्पणियाँ ऊपर पोस्ट में उल्लेख किया अब (शायद NLN के रूप में) हटा दिया गया है, लेकिन मैं करने के लिए बदलने के साथ सहमत होगा 127.255.255.255यह जो पहले से ही डिफ़ॉल्ट रूप से करने के लिए असाइन किया गया है Windows में एक प्रसारण लूपबैक पता होने के कारण (आप चलाकर इस की पुष्टि कर सकते route printमें cmd और IPv4 मार्ग तालिका के माध्यम से देख रहा है।
होप्टुप्पुनेट 23

6

यदि आपको अपने सिस्टम पर PowerShell मिला है, तो आप बस इस कमांड को निष्पादित कर सकते हैं:

powershell -command "Start-Sleep -s 1"

संपादित करें: एक समान थ्रेड पर मेरे जवाब से , लोगों ने एक मुद्दा उठाया जहां प्रारंभ करने के लिए आप कितने समय से इंतजार कर रहे हैं, इसकी तुलना में समय की मात्रा कितनी है। यदि प्रतीक्षा समय की सटीकता महत्वपूर्ण है (यानी एक या दो अतिरिक्त देरी स्वीकार्य नहीं है), तो आप इस दृष्टिकोण का उपयोग कर सकते हैं:

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

यह समय लगता है जब विंडोज़ कमांड जारी किया गया था, और पॉवरशेल स्क्रिप्ट उस समय के बाद 5 सेकंड तक सोती है। तो जब तक आपके नींद की अवधि की तुलना में शक्तियां शुरू होने में कम समय लगता है, यह दृष्टिकोण काम करेगा (यह मेरी मशीन पर लगभग 600ms है)।


6
timeout /t <seconds> <options>

उदाहरण के लिए, स्क्रिप्ट को एक गैर-निर्बाध 2-सेकंड प्रतीक्षा करने के लिए:

timeout /t 2 /nobreak >NUL

जिसका अर्थ है कि स्क्रिप्ट जारी रखने से 2 सेकंड पहले इंतजार करेगी।

डिफ़ॉल्ट रूप से, एक कीस्ट्रोक टाइमआउट को बाधित करेगा, इसलिए /nobreakस्विच का उपयोग करें यदि आप नहीं चाहते कि उपयोगकर्ता प्रतीक्षा को रद्द करने (रद्द करने) में सक्षम हो। इसके अलावा, टाइमआउट प्रति सेकंड सूचनाएं प्रदान करेगा कि उपयोगकर्ता को यह सूचित करने के लिए प्रतीक्षा करने के लिए कितना समय शेष है; यह करने के लिए आदेश पाइपिंग द्वारा हटाया जा सकता है NUL

संपादित करें: जैसा कि @martineau टिप्पणियों में बताती है , timeoutकमांड केवल विंडोज 7 और इसके बाद के संस्करण पर उपलब्ध है। इसके अलावा, pingकमांड कम प्रोसेसर समय का उपयोग करता है timeout। मैं अभी भी timeoutजहां संभव हो, का उपयोग करने में विश्वास करता हूं , हालांकि, यह ping'हैक' की तुलना में अधिक पठनीय है । और अधिक पढ़ें यहाँ


2
जाहिरा तौर पर यह कमांड केवल विंडोज 7/2008 और एक्सपी रिसोर्स किट (और संभवतः 8 / 8.1) में उपलब्ध है। स्रोत का दावा है कि pingदृष्टिकोण कम प्रोसेसर समय का उपयोग करता है।
मार्टीन्यू

5

इसे अपनी बैच फ़ाइल में रखें जहाँ आप प्रतीक्षा चाहते हैं।

@ping 127.0.0.1 -n 11 -w 1000 > null

यह पैक्सिडाब्लो के उत्तर से कैसे भिन्न है?
पीटर मोर्टेंसन

2
यह अलग नहीं है, लेकिन इसमें उत्तर कई मर्ज किए गए प्रश्नों से हैं, इसलिए जब मैंने उत्तर दिया तो सभी उत्तर मौजूद नहीं थे।
ब्रेंट स्टीवर्ट

4

नोटपैड में, लिखें:

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

अब फ़ोल्डर में प्रतीक्षा के रूप में सहेजें। C: \ WINDOWS \ System32 फ़ोल्डर में, फिर जब भी आप प्रतीक्षा करना चाहते हैं, उपयोग करें:

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

यह खुद को बार-बार पिंग करता है, प्रत्येक पिंग के बीच एक दूसरे की प्रतीक्षा करता है, और फिर यह कॉलिंग प्रोग्राम पर लौटता है, मुझे अनंत लूप दिखाई नहीं देता है, लेकिन मैंने इसे स्वयं परीक्षण किया है।
सुपरकेल

मेरी गलती, कोई अनंत लूप नहीं है। हालांकि, जैसा कि अन्य उत्तरों में से एक में उल्लेख किया गया है , यह बेहतर है pingकि न केवल एक बार कुछ किया जाए, और पूरे नंबर-रिट्रीट विकल्प के -w Timeoutबजाय मिलीसेकंड में देरी-समय के लिए विकल्प का उपयोग करें -n Count
मार्टिउ

-w Timeoutबेहतर हो सकता है, लेकिन मुझे यकीन है कि यह दर्ज किए गए समय की तुलना में एक बार और पिंग करता है।
सुपरकैल २ Super

4

संसाधन किट हमेशा इस शामिल किया गया है। कम से कम विंडोज 2000 के बाद से।

इसके अलावा, Cygwin पैकेज में एक sleep- plop है जो आपके PATH में शामिल है और इसमें cygwin.dll(या इसे जो भी कहा जाता है) और जाने का तरीका शामिल है!


2
ध्यान दें कि cygwin1.dll स्वयं के विभिन्न संस्करणों के साथ शांतिपूर्वक सह-अस्तित्व नहीं रखता है। आपके पास अपनी मशीन पर केवल एक और केवल एक cygwin1.dll है, या आपको अजीब विफलताएं मिलेंगी।
जेसपेरे

कौन सा संसाधन किट? एक से बढ़कर एक लगते हैं। क्या आप अपना जवाब अपडेट कर सकते हैं?
पीटर मोर्टेंसन

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

पायथन समाधान की तुलना में भी अधिक हल्का एक पर्ल-लाइनर है।

सात सेकंड तक सोने के लिए इसे BAT स्क्रिप्ट में रखें:

perl -e "sleep 7"

यह समाधान केवल एक सेकंड का संकल्प प्रदान करता है।

यदि आपको उच्च रिज़ॉल्यूशन की आवश्यकता है तो CPAN से समय :: HiRes मॉड्यूल का उपयोग करें। यह प्रदान करता है usleep()जो माइक्रोसेकंड में सोता है और nanosleep()जो नैनोसेकंड में सोता है (दोनों फ़ंक्शन केवल पूर्णांक तर्क देते हैं)। स्टैक ओवरफ्लो प्रश्न देखें मैं पर्ल में एक मिलीसेकंड के लिए कैसे सो सकता हूं? अधिक जानकारी के लिए।

मैंने कई वर्षों से ActivePerl का उपयोग किया है । इसे स्थापित करना बहुत आसान है।


2

या कमांड लाइन पायथन, उदाहरण के लिए, 6 और डेढ़ सेकंड के लिए:

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

हालांकि कम, यह स्वीकृत उत्तर का एक डुप्लिकेट है।
पीटर मॉर्टेंसन

@ पेटर मोर्टेंसन: यह आपको एक बैच फ़ाइल की एक पंक्ति में सब कुछ आसानी से डालने की अनुमति देता है।
मार्टिउ

2

पिंग का उपयोग का अच्छा है, जब तक आप बस "थोड़ा इंतजार करना" चाहते हैं। चूंकि आप अपने नेटवर्क पर काम कर रहे हैं और तथ्य यह है कि नीचे दिए गए अन्य कार्यों पर निर्भर हैं, इसलिए 127.0.0.1 पर कोई जवाब नहीं है। ;-) शायद यह बहुत संभावना नहीं है कि यह विफल हो जाता है, लेकिन यह असंभव नहीं है ...

यदि आप यह सुनिश्चित करना चाहते हैं कि आप बिल्कुल निर्दिष्ट समय की प्रतीक्षा कर रहे हैं, तो आपको इसका उपयोग करना चाहिए sleep कार्यक्षमता का (जिसका यह भी लाभ है कि यह CPU शक्ति का उपयोग नहीं करता है या नेटवर्क के तैयार होने की प्रतीक्षा करता है)।

नींद के लिए पहले से ही तैयार निष्पादन योग्य खोजने के लिए सबसे सुविधाजनक तरीका है। बस इसे अपने विंडोज फ़ोल्डर या अपने मानक पथ के किसी अन्य भाग में छोड़ दें और यह हमेशा उपलब्ध है।

अन्यथा, यदि आपके पास एक संकलित वातावरण है, तो आप आसानी से खुद को बना सकते हैं। Sleepसमारोह में उपलब्ध है kernel32.dll, ताकि आप केवल उपयोग करने के लिए है कि एक की जरूरत है,। :-) वीबी / वीबीए के लिए नींद की घोषणा करने के लिए अपने स्रोत की शुरुआत में निम्नलिखित की घोषणा करें:

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

C # के लिए:

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

आप इस कार्यक्षमता (विंडोज 2000 के बाद से उपलब्ध) के बारे में नींद समारोह (MSDN) में अधिक जानेंगे।

मानक C sleep()में, मानक लाइब्रेरी में शामिल किया गया है और Microsoft के Visual Studio C में फ़ंक्शन का नाम दिया गया है Sleep(), यदि मेमोरी मेरी सेवा करती है। ;-) वे दो सेकंड में तर्क लेते हैं, दो पिछले घोषणाओं के रूप में मिलीसेकंड में नहीं।


1
नींद .net फ्रेमवर्क में उपलब्ध है - थ्रेड क्लास पर एक नज़र है, जैसे: System.Threading का उपयोग करना; .... थ्रेड। सो (1000);
जॉन सोबेल

2
यदि "पिंग 127.0.0.1" विफल रहता है, तो आपके पास चिंता करने के लिए "नींद" से अधिक गंभीर सामान है - यह लूपबैक इंटरफ़ेस है, आरपीसी कुछ भी शायद पागल हो जाएगा।
पिस्कोर ने

2

सबसे अच्छा समाधान जो विंडोज 2000 के बाद सभी विंडोज संस्करणों पर काम करना चाहिए:

timeout numbersofseconds /nobreak > nul

XP प्रो पर काम नहीं करता है ...'timeout' is not recognized as an internal or external command, operable program or batch file.
Marineau

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 को स्वीकार करने की आज्ञा बता रहे हैं । यह 5 सेकंड में ऐसा करने के लिए, कोई संकेत नहीं खींचने के लिए, और इसे NUL (लिनक्स पर शून्य टर्मिनल की तरह) करने के लिए कहते हैं।


3
मैं यहाँ अपने आप को प्रतिध्वनित करूँगा: मैंने इसकी बिल्कुल भी सिफारिश नहीं की है। जिन CHOICEसंस्करणों में मुझे पता है, अगर कोई प्रतीक्षा करते समय कोई चाबी मारता है, जो अधीर लोग कभी-कभी करते हैं, तो विकल्प एक इनपुट पढ़ेगा, एक खराब इनपुट के लिए एक सिस्टम बीप देगा, और उलटी गिनती को रोक देगा, इसलिए यह तब तक लटका रहेगा जब तक कि वे वाई को धक्का नहीं देते। और अगर वे सिर्फ वाई पुश करने के लिए होते हैं, तो विकल्प 5 के लिए इंतजार करने के बजाय वहीं समाप्त होता है। इसके अलावा, यह विकल्प वास्तव में अजीब विस्टा सिंटैक्स का उपयोग कर रहा है। सामान्य पसंद आदेश इसके बजाय उपयोग CHOICE /T:Y,5 > NULकरते हैं। (पुराने संस्करणों में कोई / डी ध्वज नहीं है।) और यदि आपके पास विस्टा है, तो TIMEOUTइसके बजाय उपयोग करें ।
स्टाइल

1

आप विशिष्ट समय समाप्त करने के लिए एक .vbs फ़ाइल का भी उपयोग कर सकते हैं:

नीचे दिया गया कोड .vbs फ़ाइल बनाता है। इसे आप rbatch कोड के शीर्ष के पास रखें:

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

नीचे दिया गया कोड .vbs खोलता है और निर्दिष्ट करता है कि कब तक इंतजार करना है:

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

उपरोक्त कोड में, "1000" मिलीसेकंड में .vbs फ़ाइल में भेजे जाने के लिए समय की देरी का मूल्य है, उदाहरण के लिए, 1000 एमएस = 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"

1

आप पर Windows Vista से TIMEOUT और SLEEP कमांड हैं, लेकिन उन्हें Windows XP या Windows Server 2003 पर उपयोग करने के लिए, आपको Windows Server 2003 संसाधन टूल किट की आवश्यकता होगी ।

यहाँ आपको नींद के विकल्पों का एक अच्छा अवलोकन है (पिंग दृष्टिकोण सबसे लोकप्रिय है क्योंकि यह हर विंडोज मशीन पर काम करेगा), लेकिन वहां (कम से कम) एक का उल्लेख नहीं किया गया है जो (एब) W32TM(टाइम सर्विस) कमांड का उपयोग करता है :

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

जहां आपको एन को उन सेकंडों से बदलना चाहिए जिन्हें आप रोकना चाहते हैं। साथ ही, यह बिना किसी शर्त के हर विंडोज सिस्टम पर काम करेगा।

टाइपर्फ़ का भी उपयोग किया जा सकता है:

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

Mshta और जावास्क्रिप्ट के साथ (एक सेकंड के तहत सोने के लिए इस्तेमाल किया जा सकता है):

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 / बैच में ' स्लीप ' को पूरा करने के कई तरीके हैं :

मेरा पसंदीदा एक:

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बहुत तेज़ वेबसाइट से जुड़ने का प्रयास करेगा । क्रिया केवल 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

यह विंडोज एक्सपी एसपी 3 और विंडोज 7 पर परीक्षण किया गया था और सीएसस्क्रिप्ट का उपयोग करता है। मैंने देरी से बचने के लिए कुछ सुरक्षित गार्डों में डाल दिया। ( /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

चूंकि अन्य लोग तीसरे पक्ष के कार्यक्रम (पायथन, पर्ल, कस्टम ऐप आदि) का सुझाव दे रहे हैं, एक अन्य विकल्प विंडोज के लिए GNU CoreUtils http://gnuwin32.sourceforge.net/packages/coreutils.htm पर उपलब्ध है।

तैनाती के लिए 2 विकल्प:

  1. पूर्ण पैकेज स्थापित करें (जिसमें CoreUtils, निर्भरता, प्रलेखन, आदि का पूरा सूट शामिल होगा)।
  2. केवल 'sleep.exe' बाइनरी और आवश्यक निर्भरताएं स्थापित करें (निर्भरता प्राप्त करने के लिए depend.exe का उपयोग करें)।

CoreUtils को तैनात करने का एक लाभ यह है कि आपको इसके अतिरिक्त अन्य कार्यक्रमों की मेजबानी मिलेगी जो स्क्रिप्टिंग के लिए सहायक हैं (विंडोज बैच वांछित होने के लिए बहुत कुछ छोड़ देता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.