กำลังนอนหลับอยู่ในชุดไฟล์


150

เมื่อเขียนไฟล์แบตช์เพื่อทำให้บางอย่างเป็นอัตโนมัติบนกล่อง Windows ฉันต้องหยุดการทำงานชั่วคราวเป็นเวลาหลายวินาที (โดยปกติจะอยู่ในลูปทดสอบ / รอรอให้กระบวนการเริ่มต้น) ในเวลานั้นทางออกที่ดีที่สุดที่ฉันสามารถหาได้ใช้ ping (ฉันไม่ชอบคุณ) เพื่อให้ได้ผลตามที่ต้องการ ฉันพบบทความที่ดีกว่าของที่นี่ซึ่งอธิบาย callable "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-like sleep (ในที่สุด!) ในขณะเดียวกันสำหรับพวกเราที่ยังใช้ Windows XP, Windows 2000 หรือ (เศร้า) Windows NTมีวิธีที่ดีกว่านี้หรือไม่?

ฉันปรับเปลี่ยนsleep.pyสคริปต์ในคำตอบที่ยอมรับเพื่อให้ค่าเริ่มต้นเป็นหนึ่งวินาทีหากไม่มีข้อโต้แย้งถูกส่งผ่านบนบรรทัดคำสั่ง:

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)

หน้าดาวน์โหลด Microsoft ของชุดทรัพยากร Windows 2003 บ่งชี้ว่าสามารถใช้งานได้กับ XP ด้วย ฉันกลัวว่าจะไม่มีทางเลือกอื่นนอกจากการใช้ยูทิลิตี 'ภายนอก' เพื่อรอ: ไม่มีอะไรที่เหมือนกับสิ่งนี้ในตัวประมวลผลคำสั่ง XP
GerG

ชุดทรัพยากร Server 2003 ทำงานร่วมกับ Windows XP (และอาจจะมี w2k)
มาร์ติน Beckett

ฉันประสบปัญหาเดียวกันในอดีตและใช้การ ping ตัวเอง (ด้วยคำกล่าวข้างต้นที่ชัดเจนว่าการบันทึกว่าฉันรู้ว่ามันโง่ :))
Jack Leow


2
คุณมีสองตัวเลือก - เลียนแบบสลีปด้วยpingคำสั่งหรือดาวน์โหลดชุดทรัพยากร windows ซึ่งรวมถึงsleepคำสั่ง รายละเอียดเพิ่มเติมได้ที่นี่: ไฟล์แบตช์คำสั่ง SLEEP
Rudu

คำตอบ:


14

UPDATE

timeoutคำสั่งที่มีอยู่จาก Windows Vista และเป็นต้นไปควรจะใช้คำสั่งตามที่อธิบายไว้ในอีกคำตอบสำหรับคำถามนี้ สิ่งต่อไปนี้คือคำตอบเก่า

คำตอบเก่า

หากคุณติดตั้ง Python ไว้หรือไม่สนใจติดตั้ง (มีประโยชน์อื่นด้วย :) ให้สร้างสคริปต์sleep.pyต่อไปนี้แล้วเพิ่มที่อื่นใน PATH ของคุณ:

import time, sys

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

มันจะอนุญาตให้หยุดชั่วคราวในช่วงวินาที (เช่น 1.5 วินาที, 0.1, ฯลฯ ) หากคุณต้องการ หากคุณต้องการที่จะเรียกมันว่าเป็นsleepมากกว่าsleep.pyคุณสามารถเพิ่ม.PYส่วนขยายให้กับตัวแปรสภาพแวดล้อม PATHEXT ของคุณ ใน Windows XP คุณสามารถแก้ไขได้ใน:

My Computer →คุณสมบัติ (เมนู) →ขั้นสูง (แท็บ) →ตัวแปรสภาพแวดล้อม (ปุ่ม) →ตัวแปรระบบ (เฟรม)


32
ทำไมเราควรเขียนสคริปต์ในไพ ธ อนเมื่อมีการร้องขอโซลูชันแบบแบตช์สคริปต์ได้? ส่วนขยายพา ธ สามารถแก้ปัญหาที่ผู้ใช้ Windows ไม่ได้ติดตั้งตัวแปลหลามได้อย่างไร ขอบคุณ
Val

6
เพื่อประโยชน์ในการพกพาฉันคิดว่าวิธีนี้ควรหลีกเลี่ยงเพราะมีทางเลือกอื่น ๆ
Gras Double

1
วิธีนี้อาจเป็นวิธีแก้ปัญหาในอดีต แต่วิธีแก้ปัญหาแบบเนทีฟที่อธิบายโดย @Blorgbeard เป็นวิธีการที่แน่นอน
Mike

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
ไม่ทำงานในการใช้งานแบบไร้คอนโซล: "ข้อผิดพลาด: ไม่รองรับการเปลี่ยนเส้นทางอินพุตให้ออกจากกระบวนการทันที"
simpleuser

ฉันหมายถึงกรณีที่คุณไม่มีคอนโซลเลยเช่นเมื่อไฟล์แบตช์ทำงานในพื้นหลังผ่านทางแยกจากกระบวนการอื่น ๆ cygwin crontab หรือคำสั่ง ssh จากระยะไกลเป็นต้น
simpleuser

1
โอ้ใช่ฉันรู้ ตัวอย่างที่ฉันให้ไว้เป็นเพียงการแสดงให้เห็นถึงข้อผิดพลาด :)
Blorgbeard ออกมา

3
การเชื่อมโยงไปยังเอกสารสำหรับtimeoutเพิ่มโดย @Cristian Ciupitu เป็นบางส่วนที่ไม่ถูกต้อง - Windows XP ไม่ได้มีคำสั่งนี้
martineau

1
@HelloWorld ที่ฟังดูเหมือนมีปัญหากับ% PATH ของคุณ
Blorgbeard ออกเมื่อ

21

การใช้pingวิธีการที่อธิบายไว้เป็นวิธีที่ฉันทำเมื่อฉันไม่สามารถ (หรือไม่ต้องการ) เพิ่มไฟล์ปฏิบัติการเพิ่มเติมหรือติดตั้งซอฟต์แวร์อื่น ๆ

คุณควรจะกระตุกบางสิ่งบางอย่างที่ไม่ได้มีและใช้-wธงเพื่อที่จะล้มเหลวหลังจากที่จำนวนของเวลาที่ไม่กระตุกบางสิ่งบางอย่างที่เป็นมี (เช่น 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

ส่งคืนทันทีด้วยPING: transmit failed. General failure.
huysentruitw

IP 1.1.1.1ถ่ายโดย CloudFlare ดังนั้นสิ่งนี้จะไม่รอ 15 วินาที แต่อยู่ที่ประมาณ ms
dhcgn

16

SLEEP.exeรวมอยู่ใน Resource Kits ส่วนใหญ่เช่น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%)

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
สิ่งนี้ควรมีความแม่นยำ แต่เป็นวิธีที่ใช้งาน CPU ได้สูง โดยปกติคุณต้องการให้มีการใช้งาน interupt driven เพื่อให้กระบวนการไม่ใช้รอบของ CPU ในขณะที่รอ นี่ไม่ควรเป็นปัญหาสำหรับการรอนาน ๆ ไม่บ่อยนักเนื่องจากอาจเป็นกรณีสำหรับสถานการณ์แบทช์ส่วนใหญ่ แต่กระบวนการที่ทำงานอย่างต่อเนื่องโดยรอนานอาจส่งผลเสียต่อประสิทธิภาพของระบบ
dbenham

4
เมื่อใช้นาฬิการะบบความแม่นยำคือหนึ่งวินาที หากระบุ 2 วินาทีความล่าช้าอาจเป็นอะไรก็ได้ระหว่าง 2 วินาทีถึง 3 วินาที (จริง ๆ แล้วคือ 2.99999 ... วินาที)
ปีเตอร์มอร์เทนเซ่น

ถ้าเวลาเป็นตอนนี้ 7:59:59 และคุณต้องการรอ 7 วินาที ดูเหมือนว่าจะไม่คำนึงถึงเรื่องนี้
ashes999

สิ่งนี้ใช้เวลา CPU มากกว่าที่นับเวลาระบบ นอกจากนี้คุณกำลังดำเนินการทางคณิตศาสตร์ด้วยตัวเลขฐานแปดตั้งแต่นาทีและวินาทีที่น้อยกว่า 10 จะแสดงด้วย 0 นำในTIMEคำสั่ง
Andreas

2
@mrt: ปัญหาคือการที่คุณ%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 มันเป็นใน Windows 9x ถูกลบออกจาก XP และเพิ่มกลับสำหรับ Vista เป็นต้นไป
Devin Burke

7
ฉันไม่แนะนำเลย อย่างน้อยในทุกCHOICEเวอร์ชั่นที่ฉันรู้ถ้ามีคนกดปุ่มขณะรอซึ่งบางครั้งคนใจร้อนก็ทำเช่นนั้นตัวเลือกจะลงทะเบียนอินพุตป้อนเสียงบี๊บระบบสำหรับอินพุตที่ไม่ดีและหยุดจับเวลานับถอยหลังซึ่งหมายความว่ามันจะหยุด ที่นั่นเว้นแต่พวกเขากด N หรือ Y และถ้าพวกเขาเพิ่งจะกดหนึ่งในสองนั้นตัวเลือกจะจบลงตรงนั้นแทนที่จะรอ 5 นอกจากนี้ตัวเลือกนี้ใช้ไวยากรณ์ Vista ที่แปลกมาก คำสั่งตัวเลือกปกติทั้งหมดจะใช้แทนCHOICE /T:Y,5 > NULสิ่งนั้น ไม่มีการ/Dตั้งค่าสถานะในรุ่นเก่า
เข้ารหัสด้วยสไตล์

1
เพื่อปิดด้านบนอย่างน้อยคำสั่ง CHOICE ที่ฉันรู้จักมีปุ่มใช่ / ไม่ใช่เริ่มต้นที่แตกต่างกันตามภาษาที่เข้ามาดังนั้นหากคุณต้องพึ่งพาตัวเลือก [Y, N] เริ่มต้นแทนที่จะระบุอย่างชัดเจนด้วย/C:YNหรือเพียงแค่/C:Yนี่จะไม่ทำงานเมื่อมีคนบอกว่าเป็นคำสั่งตัวเลือกภาษาสวีเดนซึ่งอาจเป็น [J, N] เป็นค่าเริ่มต้น ดังนั้นนี่คือปัญหาในทุกประเภทของปัญหา
เข้ารหัสด้วยสไตล์

1
@ การเข้ารหัสทดสอบสิ่งนี้ใน Win7 และหากผู้ใช้กดปุ่มมันจะส่งเสียงบี๊บอย่างไรก็ตามจะยังคงหมดเวลาหลังจากอีก 5 วินาทีหลังจากที่ผู้ใช้กดปุ่ม ดังนั้นหากผู้ใช้ยังคงกดปุ่มมันจะไม่หมดเวลา ในกรณีของฉันเมื่อฉันใช้สิ่งนี้ฉันเชื่อว่าซ่อนคอนโซลเพื่อให้ผู้ใช้ไม่สามารถกดปุ่มได้ ในระบบนี้ไม่มีการเข้าถึง Python ไม่มีการเข้าถึงเพื่อปล่อย exe ของฉันเองในระบบ (ตามที่แนะนำในคำตอบอื่น ๆ ) ฉันค่อนข้าง จำกัด ในสิ่งที่ฉันสามารถทำได้ ดังนั้นคุณจะแนะนำอะไร
mlsteeves

@mlsteeves ทุก ๆ Windows, DOS และอื่น ๆ มีคำสั่งตัวเลือกที่แตกต่างกันและตามที่ระบุไว้จะไม่สามารถใช้ได้ใน Xp คำสั่งตัวเลือกจำนวนมากมีลักษณะการทำงานที่แตกต่างกันเล็กน้อยและบางคำสั่งก็มีไวยากรณ์ที่แตกต่าง ฉันโดยทั่วไปฉันใช้คำสั่ง ping เมื่อฉันต้องการนอน มันน่าเกลียด แต่น่าเชื่อถือ
เข้ารหัสด้วยสไตล์

9

คุณสามารถใช้เลเยอร์cscript WSHของ Windows และไฟล์ JavaScript wait.jsนี้:

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");

1
แม้ว่า Windows Scripting Host สามารถปิดใช้งานผ่านนโยบายกลุ่มได้
Joey

8

ขึ้นอยู่กับความต้องการความเข้ากันได้ของคุณใช้อย่างใดอย่างหนึ่งping:

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

เช่นเพื่อรอ 5 วินาทีให้ใช้

ping -n 6 localhost >nul 2>&1

หรือบน Windows 7 หรือใช้ในภายหลังtimeout:

timeout 6 >nul

2
-wมีหน่วยเป็นมิลลิวินาที-nเป็นจำนวนครั้งในการ ping และเวลาเริ่มต้นระหว่าง pings เป็นวินาที
Joey

8

คุณสามารถใช้ ping:

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

มันจะรอ 10 วินาที

เหตุผลที่คุณต้องใช้ 11 เป็นเพราะ ping แรกออกไปทันทีไม่ใช่หลังจากหนึ่งวินาที จำนวนควรมากกว่าหนึ่งวินาทีกับจำนวนวินาทีที่คุณต้องการรอ

โปรดทราบว่าจุดประสงค์ของการ-wไม่รอหนึ่งวินาที มันให้แน่ใจว่าคุณไม่รอมากขึ้นกว่าหนึ่งวินาทีในกรณีที่มีปัญหาเครือข่าย pingด้วยตัวเองจะส่งหนึ่งแพ็คเก็ต ICMP ต่อวินาที อาจไม่จำเป็นสำหรับ localhost แต่นิสัยเก่าตายยาก


ไม่แนะนำให้ใช้สำหรับการประมวลผลแบบเรียลไทม์ที่สำคัญ เนื่องจากมีการใช้คำสั่ง PING จึงเป็นไปได้ว่าไฟล์แบตช์ WAIT นี้อาจทำงานในเวลาไม่กี่มิลลิวินาที
Wael Dalloul

12
@Wael ถ้าคุณกำลังพูดถึงการรอคอยในหนึ่งวินาทีขอบเขตมิลลิวินาทีไม่กี่จะไม่เกี่ยวข้อง และถ้าคุณกำลังใช้ cmd.exe สำหรับสิ่งเรียลไทม์, คุณสมควรได้รับทุกสิ่งที่คุณได้รับ :-)
paxdiablo

-w เป็นค่าการหมดเวลา เป็นจำนวนมิลลิวินาทีที่ต้องรอการตอบกลับ ... ไม่ใช่ระยะเวลารอระหว่างปิง
quux

@quux ไม่มีที่ไหนที่ผมรัฐ-wก็หมดเวลา ( แต่ผมยอมรับว่าบางคนอาจอนุมานได้ว่าเกิดจากการขาดของฉันของความชัดเจน) ก็นำมาใช้จริงในการ จำกัด รอบเวลาที่มีปัญหาเครือข่ายซึ่งจะทำให้แต่ละรอบจะใช้เวลามากขึ้นกว่าที่จัดสรร ที่สอง ฉันได้เพิ่มย่อหน้าไปยังท้ายเพื่อชี้แจง
paxdiablo

ปัญหาคือถ้าส่ง Ping กลับเร็วขึ้นคุณอาจไม่รอหนึ่งวินาทีเต็มระหว่างส่ง Ping ดังนั้นการรอคอยของคุณจะสิ้นสุดเร็วกว่าที่คุณคิด
quux

7

มีวิธีที่ดีกว่าในการนอนหลับโดยใช้ ping คุณจะต้องการ ping ที่อยู่ที่ไม่มีอยู่เพื่อให้คุณสามารถระบุการหมดเวลาด้วยความแม่นยำมิลลิวินาที โชคดีเช่นที่อยู่ที่กำหนดไว้ในมาตรฐาน (RFC 3330) 192.0.2.xและมันก็เป็น สิ่งนี้ไม่ได้สร้างขึ้นจริง ๆ เป็นที่อยู่ที่มีจุดประสงค์เพียงอย่างเดียวของการไม่มีอยู่จริง (อาจไม่ชัดเจน แต่ใช้ได้แม้ในเครือข่ายท้องถิ่น):

192.0.2.0/24 - บล็อกนี้ถูกกำหนดเป็น "TEST-NET" เพื่อใช้ในเอกสารประกอบและโค้ดตัวอย่าง มักใช้ร่วมกับชื่อโดเมน example.com หรือ example.net ในเอกสารประกอบของผู้ขายและโปรโตคอล ที่อยู่ในบล็อกนี้ไม่ควรปรากฏบนอินเทอร์เน็ตสาธารณะ

หากต้องการนอนเป็นเวลา 123 มิลลิวินาทีให้ใช้ ping 192.0.2.1 -n 1 -w 123 >nul


ใช่การเขียนและทำความเข้าใจง่ายกว่าการเพิ่ม-nพารามิเตอร์ลงในพารามิเตอร์
Peter Mortensen

อย่างไรก็ตามฉันวัดได้แล้ว (ใช้ 100 pings) ถ้าฉันใช้ -n 3 -w 124 เวลาจริงคือ (3 + 1) * (124 + 1) = 4 * 125 = 500 ms เวลามีความเสถียรอย่างน่าประหลาดใจความละเอียด 10 มิลลิวินาทีในการอ่านข้อมูล (โดยการแจ้งเตือนด้วย CMD ตามเวลา) - และความละเอียดพื้นฐานนั้นดีกว่า 10 ms (ไม่ได้รับผลกระทบจากความละเอียดติ๊ก 16 มิลลิวินาทีปกติ)
Peter Mortensen

@mafu นั่นไม่ควรใช้ 192.0.2.0/24 ไม่ได้หมายความว่ามันไม่สามารถใช้งานได้ดังนั้นจึงไม่รับประกันว่าจะไม่มีการตอบกลับคำขอ echo ตัวอย่างเช่นกำหนดค่าสำหรับพีซีที่ใช้ Windows เครื่องใด ๆ ที่อยู่ IPv4 แบบคงที่ 192.0.2.1 และซับเน็ตมาสก์ 255.255.255.0 และเชื่อมต่ออะแดปเตอร์เครือข่ายกับอุปกรณ์อื่น ๆ สวิตช์ง่ายเพียงพอที่จะไม่เชื่อมต่อกับสิ่งใด จากนั้นเรียกใช้ping 192.0.2.1บนพีซี Windows นี้และจะเห็นได้ว่าสแต็ก Windows TCP / IP ตอบกลับตามคำขอ มีกี่คนที่รู้ว่าไม่ควรใช้ 192.0.2.0/24 สำหรับที่อยู่ IPv4 แบบคงที่
Mofi

1
ตามการอภิปรายในความคิดเห็นที่นี่ดูเหมือนว่า 192.0.2.1 ไม่ใช่สิ่งที่เข้าใจผิดได้และบางคนเสนอว่า 127.255.255.255 เป็นตัวเลือกที่ดีกว่า คิด?
JLRishe

ความคิดเห็นที่กล่าวถึงในบทความข้างต้นได้ออกตอนนี้ (อาจจะเป็น NLN) แต่ฉันจะเห็นด้วยกับการเปลี่ยนแปลงไป127.255.255.255เพราะมันเป็นที่อยู่ออกอากาศย้อนกลับใน Windows ซึ่งถูกกำหนดให้เป็นค่าเริ่มต้น (คุณสามารถยืนยันเรื่องนี้โดยการทำงานroute printใน cmd และมองผ่านตารางเส้นทาง IPv4 ที่พิมพ์)
Hoppeduppeanut

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"

การทำเช่นนี้จะใช้เวลาเมื่อคำสั่ง windows ถูกใช้และสคริปต์ powershell จะหยุดทำงานจนถึง 5 วินาทีหลังจากเวลานั้น ดังนั้นตราบใดที่ PowerShell ใช้เวลาในการเริ่มต้นน้อยกว่าระยะเวลาการนอนหลับของคุณวิธีการนี้จะใช้งานได้ (ประมาณ 600ms บนเครื่องของฉัน)


6
timeout /t <seconds> <options>

ตัวอย่างเช่นในการทำให้สคริปต์ดำเนินการรอ 2 วินาทีแบบไม่ต่อเนื่อง:

timeout /t 2 /nobreak >NUL

ซึ่งหมายความว่าสคริปต์จะรอ 2 วินาทีก่อนดำเนินการต่อ

โดยค่าเริ่มต้นการกดแป้นพิมพ์จะขัดจังหวะการหมดเวลาดังนั้นใช้/nobreakสวิตช์หากคุณไม่ต้องการให้ผู้ใช้สามารถขัดจังหวะ (ยกเลิก) การรอ นอกจากนี้การหมดเวลาจะให้การแจ้งเตือนต่อวินาทีเพื่อแจ้งให้ผู้ใช้ทราบว่าจะต้องรอนานเท่าใด NULนี้สามารถออกท่อคำสั่งไปยัง

แก้ไข:ในฐานะที่เป็น@martineau ชี้ให้เห็นในความคิดเห็นที่timeoutคำสั่งจะใช้ได้เฉพาะใน Windows 7 และข้างต้น นอกจากนี้คำสั่งใช้เวลาประมวลผลน้อยกว่าping timeoutฉันยังเชื่อในการใช้timeoutที่เป็นไปได้แม้ว่าจะอ่านได้มากกว่าping'แฮ็ค' อ่านเพิ่มเติมที่นี่


2
เห็นได้ชัดว่าคำสั่งนี้มีเฉพาะใน Windows 7/2008 และ XP Resource Kit (และอาจเป็น 8 / 8.1) แหล่งที่มาอ้างว่าpingวิธีการใช้เวลาประมวลผลน้อยลง
martineau

5

เพียงแค่ใส่สิ่งนี้ในไฟล์แบตช์ของคุณที่คุณต้องการรอ

@ping 127.0.0.1 -n 11 -w 1000 > null

สิ่งนี้แตกต่างจากคำตอบของ paxdiablo อย่างไร
Peter Mortensen

2
มันไม่แตกต่างกัน แต่คำตอบในที่นี้มาจากคำถามที่ถูกผสานหลายคำถามดังนั้นจึงไม่มีคำตอบทั้งหมดเมื่อฉันตอบกลับ
Brent Stewart

4

ใน Notepad ให้เขียน:

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

ตอนนี้บันทึกเป็น wait.bat ในโฟลเดอร์ C: \ WINDOWS \ System32 จากนั้นเมื่อใดก็ตามที่คุณต้องการรอให้ใช้:

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

มันส่ง Ping ซ้ำ ๆ กันรอเป็นครั้งที่สองระหว่างการ Ping แต่ละครั้งจากนั้นกลับสู่โปรแกรมเรียกฉันไม่เห็นลูปไม่สิ้นสุด แต่ฉันได้ทดสอบด้วยตัวเองแล้ว
SuperKael

ความผิดพลาดของฉันไม่มีข้อ จำกัด อย่างไรก็ตามดังที่กล่าวไว้ในหนึ่งในคำตอบอื่น ๆpingสิ่งที่ดีกว่าไม่ใช่เพียงแค่ครั้งเดียวและใช้-w Timeoutตัวเลือกสำหรับการหน่วงเวลาเป็นมิลลิวินาทีแทนที่จะ-n Countใช้ตัวเลือกจำนวนครั้งทั้งหมด
martineau

-w Timeoutอาจจะดีกว่า แต่ฉันแน่ใจว่ามันส่ง Ping ไปหนึ่งครั้งมากกว่าเวลาที่ป้อน
SuperKael

4

ทรัพยากร Kitได้รวมเสมอนี้ อย่างน้อยก็ตั้งแต่ Windows 2000

นอกจากนี้แพคเกจ Cygwin มีsleep- ป๋อมที่เข้าสู่เส้นทางของคุณและรวมถึงcygwin.dll(หรือสิ่งที่เรียกว่า) และวิธีที่จะไป!


2
โปรดทราบว่า cygwin1.dll ไม่ได้อยู่ร่วมกันอย่างสงบสุขกับรุ่นที่แตกต่างกันของตัวเอง คุณควรมีหนึ่ง cygwin1.dll เพียงหนึ่งเดียวบนเครื่องของคุณหรือคุณจะได้รับความล้มเหลวแปลก ๆ
JesperE

ชุดทรัพยากรใด ดูเหมือนจะมีมากกว่าหนึ่ง คุณสามารถปรับปรุงคำตอบของคุณ?
Peter Mortensen

3

ผมชอบการตอบสนองของ Aacini ฉันเพิ่มเข้าไปเพื่อจัดการกับวันและยังเปิดใช้งานเพื่อจัดการกับcentiseconds ( %TIME%outputs 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 # sleep นี้แล้ว อาจสะดวกกว่าสำหรับคุณถ้า 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

น้ำหนักเบายิ่งกว่าโซลูชัน Python ก็คือ Perl one-liner

ในการนอนหลับเป็นเวลาเจ็ดวินาทีให้ใส่สิ่งนี้ลงในสคริปต์ BAT:

perl -e "sleep 7"

วิธีการแก้ปัญหานี้ให้ความละเอียดเพียงหนึ่งวินาที

หากคุณต้องการความละเอียดที่สูงขึ้นให้ใช้โมดูล Time :: HiRes จาก CPAN มันแสดงให้เห็นusleep()ว่าสลีปใดในไมโครวินาทีและสลีปnanosleep()ใดในนาโนวินาที (ฟังก์ชันทั้งคู่ใช้อาร์กิวเมนต์จำนวนเต็มเท่านั้น) ดูคำถาม Stack Overflow ฉันจะนอนเป็นมิลลิวินาทีใน Perl ได้อย่างไร สำหรับรายละเอียดเพิ่มเติม

ฉันใช้ActivePerlมาหลายปีแล้ว มันง่ายมากที่จะติดตั้ง


2

หรือบรรทัดคำสั่ง Python ตัวอย่างเช่นสำหรับ 6 และครึ่งวินาที:

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

แม้ว่าจะสั้นกว่านี้เป็นคำตอบที่ซ้ำกัน
Peter Mortensen

@Peter Mortensen: มันยังช่วยให้คุณใส่ทุกอย่างลงในบรรทัดแบทช์ไฟล์เดียวได้อย่างง่ายดาย
martineau

2

การใช้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);

คุณจะพบข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นนี้ได้ที่นี่ (มีให้ตั้งแต่ Windows 2000) ในฟังก์ชั่นสลีป (MSDN)

ในมาตรฐาน C sleep()จะรวมอยู่ในไลบรารีมาตรฐานและใน Visual Studio C ของ Microsoft ฟังก์ชันจะตั้งชื่อSleep()ถ้าหน่วยความจำรองรับฉัน ;-) ทั้งสองนั้นใช้อาร์กิวเมนต์ในไม่กี่วินาทีไม่ใช่มิลลิวินาทีเหมือนกับการประกาศก่อนหน้านี้


1
โหมดสลีปพร้อมใช้งานในกรอบงาน. net - ดูที่คลาสของเธรดเช่นการใช้ System.Threading .... กระทู้นอนหลับ (1,000);
John Sibly

2
หาก "ping 127.0.0.1" ล้มเหลวคุณมีสิ่งที่ร้ายแรงกว่า "sleep" ที่ต้องกังวล - นี่คืออินเตอร์เฟสการวนกลับสิ่งที่ RPC อาจจะเป็นบ้า
Piskvor ออกจากอาคาร

2

ทางออกที่ดีที่สุดที่ควรใช้กับ Windows ทุกรุ่นหลังจาก Windows 2000 คือ:

timeout numbersofseconds /nobreak > nul

ใช้งานไม่ได้กับ XP Pro ...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau

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 เท่านั้น มันจะเริ่มต้นที่ y ทำใน 5 วินาทีเพื่อวาดไม่พร้อมและเพื่อทิ้งสิ่งที่มันจะพูดกับ NUL (เช่น terminal terminal บน Linux)


3
ฉันจะก้องตัวเองที่นี่: ฉันไม่แนะนำเลย ในCHOICEรุ่นที่ฉันรู้ว่าถ้ามีคนกดคีย์ขณะที่รอซึ่งบางครั้งคนใจร้อนก็ทำเช่นนั้นทางเลือกจะอ่านอินพุตป้อนบี๊บระบบให้สัญญาณไม่ดีและหยุดนับถอยหลังดังนั้นมันจะหยุดทำงาน และถ้าพวกเขาเพิ่งจะกด Y ตัวเลือกจะจบลงตรงนั้นแทนที่จะรอ 5 นอกจากนี้ตัวเลือกนี้ใช้ไวยากรณ์ Vista ที่แปลกมาก คำสั่งตัวเลือกปกติแทนที่จะใช้CHOICE /T:Y,5 > NULสำหรับสิ่งนั้น (ไม่มีแฟล็ก / D ในเวอร์ชันเก่า) และหากคุณมี Vista ให้ใช้TIMEOUTแทน
เข้ารหัสด้วยสไตล์

1

คุณยังสามารถใช้ไฟล์. vbs เพื่อทำช่วงเวลาที่เฉพาะเจาะจง:

รหัสด้านล่างสร้างไฟล์. vbs ใส่สิ่งนี้ใกล้กับส่วนบนของรหัส rbatch ของคุณ:

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

โค้ดด้านล่างจะเปิด. vbs และระบุระยะเวลาที่จะรอ:

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

ในรหัสข้างต้น "1000" คือค่าของการหน่วงเวลาที่จะส่งไปยังไฟล์. vbs เป็นมิลลิวินาทีตัวอย่างเช่น 1000 ms = 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 บนคุณมีหมดเวลาและSLEEPคำสั่ง แต่จะใช้พวกเขาใน Windows XP หรือ Windows Server 2003 คุณจะต้องมีชุดเครื่องมือที่ใช้ Windows Server 2003 Resource

ที่นี่คุณมีภาพรวมที่ดีเกี่ยวกับทางเลือกการนอนหลับ (วิธีการ 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

ด้วย mshta และ javascript (สามารถใช้ในโหมดสลีปภายใต้หนึ่งวินาที):

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 / batch:

คนที่ฉันชอบ:

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

สิ่งนี้ใช้localhostเวอร์ชันของ IPv6 แทน

มีวิธีการมากมายในการดำเนินการนี้ อย่างไรก็ตามฉันชอบวิธีที่ 1 สำหรับ Windows Vista และรุ่นที่ใหม่กว่าและวิธีที่ใช้มากที่สุด (วิธีที่ 2) สำหรับระบบปฏิบัติการรุ่นก่อนหน้า


0

คุณสามารถจินตนาการได้โดยใส่ข้อความหยุดชั่วคราวในแถบชื่อเรื่อง:

@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

สิ่งนี้ถูกทดสอบใน Windows XP SP3 และ Windows 7 และใช้ CScript ฉันใส่การ์ดรักษาความปลอดภัยบางอย่างเพื่อหลีกเลี่ยงการแสดงข้อความ "" ( /qจะเป็นอันตราย)

รอหนึ่งวินาที:

sleepOrDelayExecution 1000

รอ 500 ms แล้วเรียกใช้สิ่งต่าง ๆ หลังจาก:

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

เนื่องจากคนอื่นแนะนำโปรแกรมของบุคคลที่สาม (Python, Perl, app แบบกำหนดเอง ฯลฯ ) ตัวเลือกอื่นคือ GNU CoreUtils สำหรับ Windows มีให้ที่http://gnuwin32.sourceforge.net/packages/coreutils.htm http://gnuwin32.sourceforge.net/packages/coreutils.htm

2 ตัวเลือกสำหรับการปรับใช้:

  1. ติดตั้งแพคเกจเต็มรูปแบบ (ซึ่งจะรวมถึงชุดเต็มของ CoreUtils การอ้างอิงเอกสาร ฯลฯ )
  2. ติดตั้งเฉพาะไบนารี 'sleep.exe' และการพึ่งพาที่จำเป็น (ใช้ depend.exe เพื่อรับการอ้างอิง)

ข้อดีอย่างหนึ่งของการปรับใช้ CoreUtils ก็คือคุณจะได้รับโฮสต์ของโปรแกรมอื่น ๆ ที่เป็นประโยชน์สำหรับการเขียนสคริปต์ (ชุดแบตช์ของ Windows จะต้องได้รับการพิจารณาเป็นอย่างมาก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.