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?
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?
Câu trả lời:
Cách chính xác để ngủ trong một tệp bó là sử dụng timeout
lệ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
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
Ping
chỉ đơn giản là công cụ sai cho công việc.
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
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ó ping
một trong hai
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 timeout
cho 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
, CScript
chí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.Sleep
quy 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%