Làm thế nào để ngủ trong một tập tin hàng loạt?


132

Làm cách nào để tạm dừng thực thi một lúc trong tệp bó Windows giữa lệnh và lệnh tiếp theo?


Đây có phải là dự định để trở thành một kinh điển? Nếu vậy thì một số văn bản giải thích có thể thích hợp.
John Gardeniers

2
"Văn bản giải thích" như trong?
Massimo

2
Hầu hết, nếu không phải tất cả, các câu hỏi kinh điển tôi từng thấy bao gồm văn bản mô tả ý định của câu hỏi đó.
John Gardeniers

Hoặc một số văn bản giải thích tình huống ... Chủ yếu là để giúp SEO, nhưng cũng giúp đóng khung Câu trả lời tiềm năng.
Chris S

2
SEO chỉ hoạt động tốt. Lượt đầu tiên cho tôi trên tìm kiếm Google.
jbo5112

Câu trả lời:


194

Cách chính xác để ngủ trong một tệp bó là sử dụng timeoutlệnh, được giới thiệu trong Windows 2000.

Để chờ ở đâu đó trong khoảng từ 29 đến 30 giây :

timeout /t 30

Thời gian chờ sẽ bị gián đoạn nếu người dùng nhấn bất kỳ phím nào; tuy nhiên, lệnh cũng chấp nhận chuyển đổi tùy chọn /nobreak, có hiệu quả bỏ qua mọi thứ mà người dùng có thể nhấn, ngoại trừ một điều rõ ràng CTRL-C:

timeout /t 30 /nobreak

Ngoài ra, nếu bạn không muốn lệnh in đếm ngược trên màn hình, bạn có thể chuyển hướng đầu ra của nó sang NUL:

timeout /t 30 /nobreak > NUL

6
Lệnh hết thời gian không hoạt động với Windows XP ngay cả khi đã cài đặt bộ Tài nguyên 2003 và lệnh ngủ không hoạt động trong Windows 7, vì vậy lệnh ping vẫn có thể được sử dụng tốt nếu bạn đang sử dụng tệp bó trên cả Win7 và WinXP.

12
thời gian chờ không hoạt động trong các tập lệnh không tương tác: "LRI: Chuyển hướng đầu vào không được hỗ trợ, thoát khỏi quy trình ngay lập tức." vì vậy đôi khi sử dụng hack với "ping" được ưu tiên.
iMysak

14

Vì nó cũng áp dụng ở đây, tôi sẽ sao chép câu trả lời của tôi từ một trang web khác .

Nếu bạn muốn sử dụng ping, có một cách tốt hơn. Bạn sẽ muốn ping một địa chỉ không tồn tại, vì vậy bạn có thể chỉ định thời gian chờ với độ chính xác đến mili giây. May mắn thay, một địa chỉ như vậy được xác định trong một tiêu chuẩn (RFC 3330), và nó là 192.0.2.x. Đây không phải là một trang điểm, nó thực sự là một địa chỉ với mục đích duy nhất là không tồn tại (nó có thể không rõ ràng, nhưng nó được áp dụng ngay cả trong các mạng cục bộ):

192.0.2.0/24 - Khối này được gán là "TEST-NET" để sử dụng trong tài liệu và mã ví dụ. Nó thường được sử dụng cùng với tên miền example.com hoặc example.net trong tài liệu về nhà cung cấp và giao thức. Địa chỉ trong khối này sẽ không xuất hiện trên Internet công cộng.

Để ngủ trong 123 mili giây, sử dụng ping 192.0.2.1 -n 1 -w 123 >nul


3
Xin đừng làm vậy, ngay cả khi nó tốt hơn một chút so với địa chỉ thật. Pingchỉ đơn giản là công cụ sai cho công việc.
Massimo

1
@Massimo Rất có thể đó không phải là những gì nó dự định làm :) Nhưng tôi nghĩ đó vẫn là một giải pháp tốt - nó hoạt động tốt hơn thời gian chờ trong một số tình huống (đặc biệt là độ phân giải cao hơn). Ngoài ra, nó trở nên khá nổi tiếng, vì vậy hầu hết mọi người sẽ không ngạc nhiên (tức là bối rối) khi họ nhìn thấy nó trong tệp bó của bạn.
mafu

2
@Massimo Được rồi! Tôi đoán chúng ta chỉ có quan điểm khác nhau. Nếu bạn không phiền tôi vẫn để lại câu trả lời này vì nó có vẻ tốt hơn so với ping localhost n lần như thường được mô tả.
mafu

7
thời gian chờ là giải pháp phù hợp cho các hệ điều hành mà nó hoạt động. ping là giải pháp duy nhất hoạt động từ 5.1-6.3. Với 25% hệ thống vẫn còn trên 5.1, thời gian chờ không phải là "cách chính xác".
Wyrmwood

3
thời gian chờ là giải pháp sai cho bất kỳ hệ điều hành nào, vì nó bị hỏng nghiêm trọng ngay cả trong Windows 10. Lệnh sử dụng nào bị lỗi chỉ vì đầu vào được chuyển hướng?
Harry Johnston

8

Bạn cũng có thể chèn một ping vào localhost. Điều này sẽ mất 4 giây để hoàn thành (theo mặc định). Nó được coi là một loại bùn của một số người, nhưng hoạt động khá tốt như nhau.

Lệnh:
ping 127.0.0.1


6
Ừm ... toàn bộ mục đích của Q / A này là chính xác để sửa hai câu hỏi khác có câu trả lời được chấp nhận của họ, nhưng không thể sửa được nữa vì OP của họ không còn nữa.
Massimo

6
Trong khi nó sẽ hoạt động, nó tương đương với việc lái vít bằng búa. Một công cụ sai có thể hoạt động, nhưng nó vẫn sai.
voretaq7

1
@Mark ALLen Nói cách khác, Windows NT4, 95, 98, ME trở lên?
Chris McKeown

5
@MarkAllen - về mặt kỹ thuật, sau đó bạn phải lo lắng về việc có hay không pingđi kèm với hệ điều hành của bạn. Nếu bạn đang lo lắng về đủ '95 '98 hoặc ME thì bạn nên càng không kém phần lo lắng về 6.22 mà không có pingmột trong hai
Đánh dấu Henderson

4
@MarkHenderson Dễ dàng hơn (đối với tôi) để nhớ liệu một bản phát hành cụ thể của HĐH có hỗ trợ TCP / IP hay không hơn là nhớ nó có bao gồm lệnh tôi đã nghe trước đây hay không. Bạn biết?
Mark Allen

2

Tuyên bố miễn trừ trách nhiệm : đây không phải là giải pháp "lý tưởng", vì vậy đừng bận tâm đến việc đánh vào đầu tôi như đã làm với những người khuyên ping...

Khi có thể, sử dụng timeoutcho chắc chắn. Nhưng như đã lưu ý trong các bình luận, đó không phải lúc nào cũng là một lựa chọn (ví dụ trong chế độ không tương tác). Sau đó, tôi đồng ý rằng ping"bùn" có lẽ là lựa chọn tốt nhất tiếp theo, vì nó rất đơn giản. Điều đó nói rằng, tôi cung cấp một tùy chọn khác ... nhúng một số VB Script .

Cơ sở của giải pháp này có tất cả các loại ứng dụng ngoài điều này. Thông thường VBS có thể làm những việc mà lô không thể, hoặc ít nhất là làm như vậy với sự dễ dàng hơn nhiều. Sử dụng kỹ thuật được minh họa ở đây, bạn có thể kết hợp cả hai (không phải "liền mạch", mà là "chức năng" ...).

Đây là một lớp lót, để tạo một kịch bản tạm thời, thực hiện nó, sau đó xóa nó. Kịch bản thực hiện việc ngủ cho bạn (trong 3 giây trong ví dụ này).

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

Về cơ bản là điều tương tự, được viết hơi khác một chút:

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

Và cuối cùng, như ping, CScriptchính nó có một tùy chọn thời gian chờ! Vì vậy, nếu bạn nhập một vòng lặp vô hạn trong tập lệnh, bạn có thể để trình thông dịch thực thi thời lượng. Lưu ý, đây là một hoạt động "bận rộn", ăn CPU và do đó tôi không khuyên bạn nên sử dụng WScript.Sleepquy trình này, nhưng tôi trình bày nó như một tùy chọn khái niệm vì mục đích hoàn chỉnh:

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

Bạn biết đấy ... bạn có thể làm điều này trong powershell, tôi mong đợi, mà không phải viết một tập tin.
Harry Johnston

Vâng, đó có thể là một giải pháp tốt khác, mặc dù giải pháp này tôi tin là tương thích ngược hơn với các phiên bản Windows cũ.
BuvinJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.