Bagaimana cara tidur dalam file batch?

132

Bagaimana cara menjeda eksekusi untuk sementara waktu dalam file batch Windows antara perintah dan yang berikutnya?

Massimo
sumber
Apakah ini dimaksudkan untuk menjadi kanonik? Jika demikian maka beberapa teks penjelasan mungkin sesuai.
John Gardeniers
2
"Teks penjelasan" seperti pada?
Massimo
2
Sebagian besar, jika tidak semua, pertanyaan kanonik yang saya lihat termasuk teks yang menggambarkan maksud dari pertanyaan itu.
John Gardeniers
Atau beberapa teks yang menjelaskan situasinya ... Sebagian besar membantu SEO, tetapi juga membantu membingkai Jawaban yang potensial.
Chris S
2
SEO bekerja dengan baik. Hit pertama untuk saya di pencarian Google.
jbo5112

Jawaban:

194

Cara yang benar untuk tidur dalam file batch adalah dengan menggunakan timeoutperintah, yang diperkenalkan pada Windows 2000.

Untuk menunggu di suatu tempat antara 29 dan 30 detik :

timeout /t 30

Waktu tunggu akan terputus jika pengguna menekan tombol apa saja; namun, perintah itu juga menerima sakelar opsional /nobreak, yang secara efektif mengabaikan apa pun yang dapat ditekan pengguna, kecuali secara eksplisit CTRL-C:

timeout /t 30 /nobreak

Selain itu, jika Anda tidak ingin perintah untuk mencetak hitungan mundurnya di layar, Anda dapat mengarahkan hasilnya ke NUL:

timeout /t 30 /nobreak > NUL
Massimo
sumber
6
Perintah batas waktu tidak bekerja dengan Windows XP bahkan dengan kit Resource 2003 diinstal dan perintah tidur tidak bekerja di Windows 7 sehingga perintah ping masih dapat digunakan dengan baik jika Anda menggunakan file batch pada Win7 dan WinXP.
12
batas waktu tidak berfungsi dalam skrip non-interaktif: "GALAT: Pengalihan input tidak didukung, segera keluar dari proses." jadi kadang-kadang menggunakan hack dengan "ping" lebih disukai.
iMysak
14

Karena ini berlaku di sini juga, saya akan menyalin jawaban saya dari situs lain .

Jika Anda ingin menggunakan ping, ada cara yang lebih baik. Anda akan ingin melakukan ping ke alamat yang tidak ada, sehingga Anda dapat menentukan batas waktu dengan presisi milidetik. Untungnya, alamat seperti itu didefinisikan dalam standar (RFC 3330), dan memang demikian 192.0.2.x. Ini tidak dibuat-buat, ini benar-benar alamat dengan tujuan tidak ada (mungkin tidak jelas, tetapi berlaku bahkan di jaringan lokal):

192.0.2.0/24 - Blok ini ditugaskan sebagai "TEST-NET" untuk digunakan dalam dokumentasi dan contoh kode. Ini sering digunakan bersama dengan nama domain example.com atau example.net dalam dokumentasi vendor dan protokol. Alamat dalam blok ini tidak akan muncul di Internet publik.

Untuk tidur selama 123 milidetik, gunakan ping 192.0.2.1 -n 1 -w 123 >nul

mafu
sumber
3
Tolong jangan lakukan itu, bahkan jika itu sedikit lebih baik daripada mem-ping alamat asli. Pinghanyalah alat yang salah untuk pekerjaan itu.
Massimo
1
@ Massimo Kemungkinan besar bukan itu yang dimaksudkan untuk dilakukan :) Tapi saya pikir ini masih merupakan solusi yang bagus - ia bekerja lebih baik daripada batas waktu dalam beberapa skenario (khususnya resolusi yang lebih tinggi). Juga, itu menjadi sangat terkenal, sehingga kebanyakan orang tidak akan sangat terkejut (yaitu bingung) ketika mereka melihatnya di file batch Anda.
mafu
2
@ Massimo Baiklah! Saya kira kita hanya memiliki pandangan yang berbeda. Jika Anda tidak keberatan saya akan tetap meninggalkan jawaban ini karena tampaknya lebih baik daripada melakukan ping localhost dan kali seperti yang paling sering dijelaskan.
mafu
7
batas waktu adalah solusi yang tepat untuk sistem operasi tempat kerjanya. ping adalah satu-satunya solusi yang bekerja dari 5.1-6.3. Dengan 25% sistem masih di 5.1, batas waktu bukanlah "cara yang benar".
Wyrmwood
3
timeout adalah solusi yang salah untuk sistem operasi apa pun, karena itu rusak fatal bahkan di Windows 10. Apa gunanya perintah yang gagal hanya karena input diarahkan?
Harry Johnston
8

Anda juga dapat memasukkan ping ke localhost. Ini akan memakan waktu 4 detik untuk menyelesaikan (secara default). Ini dianggap sebagai kludge oleh beberapa orang, tetapi bekerja dengan cukup baik.

Perintah:
ping 127.0.0.1

pembantunya
sumber
6
Ehm ... seluruh tujuan Q ini / A adalah persis untuk memperbaiki dua pertanyaan lain yang memiliki ini sebagai jawaban mereka diterima, tetapi tidak bisa lagi diperbaiki karena OP mereka tidak lagi sekitar.
Massimo
6
Sementara itu akan berhasil itu setara dengan mengendarai sekrup dengan palu. Alat yang salah mungkin berhasil, tetapi masih salah.
voretaq7
1
@ Markallen Dengan kata lain, Windows NT4, 95, 98, ME dan lebih lama?
Chris McKeown
5
@ Markallen - secara teknis Anda kemudian harus khawatir tentang apakah atau tidak pingdatang dengan OS Anda. Jika Anda cukup khawatir tentang '95 '98 atau ME, maka Anda juga harus sama khawatirnya dengan 6.22 yang tidak memiliki pingkeduanya
Mark Henderson
4
@MarkHenderson Lebih mudah (bagi saya) untuk mengingat apakah rilis OS tertentu mendukung TCP / IP daripada mengingat apakah itu termasuk perintah yang belum saya dengar sebelumnya atau tidak. Kamu tahu?
Mark Allen
2

Penafian : ini bukan solusi "ideal", jadi jangan repot-repot memukuli saya seperti yang dilakukan pada mereka yang merekomendasikan ping...

Jika memungkinkan, gunakan timeoutdengan pasti. Tetapi seperti yang disebutkan dalam komentar, itu tidak selalu menjadi pilihan (misalnya dalam mode non-interaktif). Setelah itu, saya setuju bahwa ping"kludge" mungkin merupakan pilihan terbaik berikutnya, karena sangat sederhana. Yang mengatakan, saya menawarkan opsi lain ... embed VB Script .

Dasar dari solusi ini memiliki segala macam aplikasi di luar ini. Seringkali VBS dapat melakukan hal-hal yang tidak dapat dilakukan batch, atau paling tidak melakukannya dengan lebih mudah secara drastis. Dengan menggunakan teknik yang diilustrasikan di sini, Anda dapat mencampur keduanya (tidak "mulus", tetapi "fungsional" ...).

Berikut ini adalah satu baris, untuk membuat skrip temp, jalankan, lalu hapus. Script melakukan tidur untuk Anda (selama 3 detik dalam contoh ini).

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

Ini pada dasarnya hal yang sama, ditulis sedikit berbeda:

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

Dan akhirnya, seperti ping, CScriptitu sendiri memiliki opsi batas waktu! Jadi, jika Anda memasukkan loop tak terbatas dalam skrip, Anda dapat membiarkan penerjemah memberlakukan durasi. Catatan, ini adalah operasi "sibuk", yang memakan CPU, dan karena itu saya tidak merekomendasikannya ketika Anda dapat menggunakan WScript.Sleepprosedur, tapi saya menyajikannya sebagai opsi konseptual demi kelengkapan:

set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%
Terima kasih
sumber
Anda tahu ... Anda bisa melakukan ini di PowerShell, saya harapkan, tanpa harus menulis file.
Harry Johnston
Ya, itu mungkin solusi lain yang bagus, meskipun yang ini saya percaya lebih kompatibel dengan Windows versi lama.
BuvinJ