จะนอนในแบตช์ไฟล์ได้อย่างไร?


132

วิธีหยุดการทำงานชั่วคราวชั่วขณะหนึ่งในไฟล์แบตช์ Windows ระหว่างคำสั่งและไฟล์ถัดไป


นี่ตั้งใจที่จะกลายเป็นบัญญัติหรือไม่? ถ้าเป็นเช่นนั้นข้อความอธิบายบางอย่างอาจเหมาะสม
John Gardeniers

2
"ข้อความอธิบาย" เช่นเดียวกับใน?
Massimo

2
ส่วนใหญ่ถ้าไม่ใช่ทั้งหมดคำถามตามบัญญัติที่ฉันเคยเห็นรวมถึงข้อความที่อธิบายถึงเจตนาของคำถามนั้น
John Gardeniers

หรือข้อความอธิบายสถานการณ์ ... ส่วนใหญ่จะช่วย SEO แต่ก็ช่วยกำหนดกรอบคำตอบที่เป็นไปได้
Chris S

2
SEO ทำงานได้ดี ตีแรกให้ฉันในการค้นหาของ Google
jbo5112

คำตอบ:


194

วิธีที่ถูกต้องในโหมดสลีปในไฟล์แบตช์คือการใช้timeoutคำสั่งที่แนะนำใน Windows 2000

หากต้องการรอสักครู่ระหว่าง 29 ถึง 30 วินาที :

timeout /t 30

การหมดเวลาจะถูกขัดจังหวะหากผู้ใช้กดปุ่มใด ๆ อย่างไรก็ตามคำสั่งยังยอมรับสวิตช์ทางเลือก/nobreakซึ่งจะไม่สนใจสิ่งใดที่ผู้ใช้อาจกดยกเว้นที่ชัดเจนCTRL-C:

timeout /t 30 /nobreak

นอกจากนี้หากคุณไม่ต้องการให้คำสั่งพิมพ์การนับถอยหลังบนหน้าจอคุณสามารถเปลี่ยนเส้นทางการแสดงผลไปที่NUL:

timeout /t 30 /nobreak > NUL

6
คำสั่ง timeout ไม่ทำงานกับ Windows XP แม้จะติดตั้งชุด Resource 2003 และคำสั่ง sleep ไม่ทำงานใน Windows 7 ดังนั้นคำสั่ง ping ยังสามารถใช้งานได้ดีหากคุณใช้แบตช์ไฟล์ทั้งใน Win7 และ WinXP

12
การหมดเวลาไม่ทำงานในสคริปต์ที่ไม่โต้ตอบ: "ข้อผิดพลาด: การเปลี่ยนเส้นทางอินพุตไม่ได้รับการสนับสนุนออกจากกระบวนการทันที" ดังนั้นบางครั้งการใช้แฮ็คกับ "ping" เป็นที่ต้องการ
iMysak

14

เพราะมันใช้ที่นี่มากเกินไปผมจะคัดลอกคำตอบของฉันจากเว็บไซต์อื่น

หากคุณต้องการใช้ 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


3
โปรดอย่าทำเช่นนั้นแม้ว่าจะดีกว่าการส่งที่อยู่จริงไปเล็กน้อย Pingเป็นเครื่องมือที่ผิดสำหรับงาน
Massimo

1
@ Massimo มันอาจไม่ใช่สิ่งที่ตั้งใจจะทำ :) แต่ฉันคิดว่ามันยังเป็นทางออกที่ดี - มันทำงานได้ดีกว่าการหมดเวลาในบางสถานการณ์ (โดยเฉพาะความละเอียดที่สูงกว่า) นอกจากนี้ยังเป็นที่รู้จักกันดีดังนั้นคนส่วนใหญ่จะไม่แปลกใจมาก (เช่นสับสน) เมื่อพวกเขาเห็นมันในไฟล์แบทช์ของคุณ
mafu

2
@ Massimo เอาล่ะ! ฉันเดาว่าเรามีมุมมองที่ต่างออกไป หากคุณไม่รังเกียจฉันจะยังคงตอบคำถามนี้ต่อไปเพราะมันดูเหมือนจะดีกว่าการส่งคำสั่ง localhost n ครั้งตามที่อธิบายบ่อยที่สุด
mafu

7
การหมดเวลาเป็นวิธีแก้ปัญหาที่เหมาะสมสำหรับระบบปฏิบัติการที่ใช้งานได้ ping เป็นทางออกเดียวที่ทำงานได้จาก 5.1-6.3 ด้วย 25% ของระบบที่ยังคงอยู่ใน 5.1 การหมดเวลาไม่ใช่ "วิธีที่ถูกต้อง"
Wyrmwood

3
การหมดเวลาเป็นวิธีแก้ปัญหาที่ไม่ถูกต้องสำหรับระบบปฏิบัติการใด ๆ เพราะมันถูกทำลายอย่างร้ายแรงแม้ใน Windows 10 การใช้คำสั่งใดที่ล้มเหลวเพียงเพราะอินพุตถูกเปลี่ยนเส้นทาง?
Harry Johnston

8

คุณยังสามารถแทรก ping ไปยัง localhost ขั้นตอนนี้จะใช้เวลา 4 วินาทีจึงจะเสร็จสมบูรณ์ (โดยค่าเริ่มต้น) บางคนก็ถือว่าเป็นกระบอง แต่ก็ใช้งานได้ดีเหมือนกันทั้งหมด

คำสั่ง:
ping 127.0.0.1


6
Ehm ... วัตถุประสงค์ทั้งหมดของ Q นี้ / A เป็นว่าที่จะแก้ไขสองคำถามอื่น ๆ ที่มีนี้เป็นคำตอบที่ได้รับการยอมรับของพวกเขา แต่ไม่สามารถได้รับการแก้ไขเพราะ OP ของพวกเขาไม่ได้อยู่รอบ ๆ
Massimo

6
ในขณะที่ใช้งานได้จะเทียบเท่ากับการใช้สกรูกับค้อน เครื่องมือที่ไม่ถูกต้องอาจใช้งานได้ แต่ก็ยังผิดอยู่
voretaq7

1
@ MarkAllen กล่าวอีกนัยหนึ่งคือ Windows NT4, 95, 98, ME และรุ่นเก่ากว่า
Chris McKeown

5
@ MarkAllen - ในทางเทคนิคแล้วคุณต้องกังวลว่าจะpingมาพร้อมกับระบบปฏิบัติการของคุณหรือไม่ หากคุณกังวลพอเกี่ยวกับ '95 '98 หรือ ME คุณควรกังวลอย่างเท่าเทียมกันเกี่ยวกับ 6.22 ซึ่งไม่มีpingเช่นกัน
Mark Henderson

4
@ MarkHenderson ง่ายกว่า (สำหรับฉัน) ที่จะจำได้ว่าระบบปฏิบัติการรุ่นใดรุ่นหนึ่งรองรับ TCP / IP หรือไม่กว่าจะจำได้ว่ามันมีคำสั่งที่ฉันไม่เคยได้ยินมาก่อนหรือไม่ คุณรู้?
Mark Allen

2

คำเตือน : นี่ไม่ใช่ทางออกที่ "ดีเลิศ" ดังนั้นอย่าไปตบหัวฉันอย่างที่ทำกับผู้ที่แนะนำping...

หากเป็นไปได้ให้ใช้อย่างtimeoutแน่นอน แต่ดังที่ระบุไว้ในความคิดเห็นนั่นไม่ใช่ตัวเลือกเสมอ (เช่นในโหมดที่ไม่ใช่แบบโต้ตอบ) หลังจากนั้นฉันยอมรับว่าping"kludge" อาจเป็นตัวเลือกที่ดีที่สุดถัดไปเนื่องจากง่ายมาก ที่กล่าวว่าฉันมีตัวเลือกอื่น ... ฝังบางสคริปต์ VB

พื้นฐานของโซลูชันนี้มีแอปพลิเคชันทุกประเภทที่นอกเหนือจากนี้ บ่อยครั้งที่ VBS สามารถทำสิ่งต่าง ๆ ที่ชุดไม่สามารถหรืออย่างน้อยที่สุดก็ทำได้อย่างง่ายดายมากขึ้น เมื่อใช้เทคนิคที่แสดงไว้ที่นี่คุณสามารถผสมสองอย่าง (ไม่ใช่ "ต่อเนื่อง" แต่ "ทำงานได้" ... )

ต่อไปนี้เป็นขั้นตอนเดียวในการสร้างสคริปต์ชั่วคราวดำเนินการแล้วลบออก สคริปต์ทำการสลีปให้คุณ (เป็นเวลา 3 วินาทีในตัวอย่างนี้)

echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs

นี่คือสิ่งเดียวกันโดยทั่วไปเขียนแตกต่างกันเล็กน้อย:

set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%

และแล้วในที่สุดเช่นping, CScriptตัวเองมีตัวเลือกหมดเวลา! ดังนั้นหากคุณป้อนการวนซ้ำไม่ จำกัด ในสคริปต์คุณสามารถให้ล่ามบังคับใช้ระยะเวลา หมายเหตุนี่เป็นการดำเนินการ "ไม่ว่าง" ซึ่งกินซีพียูและดังนั้นฉันจึงไม่แนะนำเมื่อคุณสามารถใช้WScript.Sleepโพรซีเดอร์ได้ แต่ฉันแสดงเป็นตัวเลือกแนวคิดเพื่อความสมบูรณ์:

set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%

คุณรู้ ... คุณสามารถทำได้ใน PowerShell ฉันคาดหวังโดยไม่ต้องเขียนไฟล์
Harry Johnston

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