Saat menulis file batch untuk mengotomatiskan sesuatu pada kotak Windows, saya harus menghentikan sementara eksekusi selama beberapa detik (biasanya dalam lingkaran tes / tunggu, menunggu proses untuk memulai). Pada saat itu, solusi terbaik yang bisa saya temukan menggunakan ping (I kid you not) untuk mencapai efek yang diinginkan. Saya telah menemukan artikel yang lebih baik di sini , yang menggambarkan callable "wait.bat", diimplementasikan sebagai berikut:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Anda kemudian dapat memasukkan panggilan ke wait.bat dalam file batch Anda sendiri, meneruskan jumlah detik untuk tidur.
Rupanya Windows 2003 Resource Kit menyediakan perintah tidur mirip Unix (akhirnya!). Sementara itu, bagi kita yang masih menggunakan Windows XP, Windows 2000 atau (sayangnya) Windows NT , apakah ada cara yang lebih baik?
Saya memodifikasi sleep.py
skrip dalam jawaban yang diterima , sehingga defaultnya menjadi satu detik jika tidak ada argumen yang dilewatkan pada baris perintah:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
sumber
ping
perintah, atau unduh kit sumber daya windows yang mencakupsleep
perintah. Lebih detail di sini: File batch Perintah SLEEPJawaban:
MEMPERBARUI
The
timeout
perintah, tersedia dari Windows Vista dan seterusnya harus perintah digunakan, seperti yang dijelaskan dalam lain jawaban untuk pertanyaan ini. Berikut ini adalah jawaban lama .Jawaban lama
Jika Anda menginstal Python, atau tidak keberatan menginstalnya (Python juga memiliki kegunaan lain :), buat saja skrip sleep.py berikut dan tambahkan di suatu tempat di PATH Anda:
Ini akan memungkinkan jeda sub-detik (misalnya, 1,5 detik, 0,1, dll.), Jika Anda memiliki kebutuhan seperti itu. Jika Anda ingin menyebutnya
sleep
bukansleep.py
, maka Anda dapat menambahkan.PY
ekstensi ke variabel lingkungan PATHEXT Anda. Pada Windows XP, Anda dapat mengeditnya di:Komputer Saya → Properti (menu) → Lanjutan (tab) → Variabel Lingkungan (tombol) → Variabel sistem (bingkai)
sumber
The
timeout
perintah tersedia dari Windows Vista dan seterusnya:Catatan: Tidak berfungsi dengan pengalihan input - contoh sepele:
sumber
timeout
, ditambah dengan @Cristian Ciupitu, sebagian salah - Windows XP tidak memiliki perintah ini.Menggunakan
ping
metode sebagaimana diuraikan adalah bagaimana saya melakukannya ketika saya tidak bisa (atau tidak ingin) menambah lebih banyak executable atau menginstal perangkat lunak lain.Anda harus melakukan ping sesuatu yang tidak ada, dan menggunakan
-w
bendera sehingga gagal setelah jumlah waktu, bukan ping sesuatu yang adalah ada (seperti localhost)-n
kali. Ini memungkinkan Anda untuk menangani waktu kurang dari satu detik, dan saya pikir itu sedikit lebih akurat.misalnya
(uji bahwa 1.1.1.1 tidak diambil)
sumber
PING: transmit failed. General failure.
1.1.1.1
diambil oleh CloudFlare, jadi ini tidak akan menunggu 15-an tetapi sekitar beberapa ms.SLEEP.exe
termasuk dalam sebagian besar Resource Kit mis . Windows Server 2003 Resource Kit yang dapat diinstal pada Windows XP juga.sumber
Saya tidak setuju dengan jawaban yang saya temukan di sini.
Saya menggunakan metode berikut sepenuhnya berdasarkan pada kemampuan Windows XP untuk melakukan penundaan dalam file batch:
DELAY.BAT:
Anda juga dapat memasukkan hari dalam perhitungan sehingga metode ini juga berfungsi ketika interval penundaan melewati tengah malam.
sumber
TIME
perintah.%TIME%
menggunakan koma untuk memisahkan centisecond, bukan titik! Cukup tambahkan koma diDELIMS=:.,"
...Saya menghadapi masalah yang sama, tetapi saya baru saja mengetuk aplikasi konsol C ++ yang sangat singkat untuk melakukan hal yang sama. Cukup jalankan MySleep.exe 1000 - mungkin lebih mudah daripada mengunduh / menginstal seluruh kit sumber daya.
sumber
Di Server Fault, pertanyaan serupa diajukan , dan solusinya adalah:
sumber
CHOICE
versi yang saya tahu, jika seseorang menekan tombol sambil menunggu, yang kadang-kadang dilakukan oleh orang-orang yang tidak sabar, maka pilihan akan mendaftarkan input, memberikan bunyi bip sistem untuk input yang buruk, dan menghentikan penghitung waktu mundur, yang berarti itu akan menggantung di sana kecuali mereka menekan N atau Y. Dan jika mereka hanya mendorong salah satu dari keduanya, maka pilihan berakhir di sana daripada menunggu 5. Juga, pilihan ini menggunakan sintaks Vista yang sangat aneh. Semua perintah pilihan normal akan digunakanCHOICE /T:Y,5 > NUL
untuk itu. Tidak ada/D
bendera di versi lama./C:YN
atau hanya/C:Y
, ini tidak akan berfungsi ketika seseorang kebetulan memiliki, katakanlah, perintah pilihan Swedia yang mungkin akan melakukan [J, N] secara default. Jadi ini terperosok dalam segala macam masalah.Anda bisa menggunakan lapisan WSH cscript Windows dan file JavaScript wait.js ini :
sumber
Tergantung pada kebutuhan kompatibilitas Anda, gunakan
ping
:misal menunggu 5 detik, gunakan
atau pada Windows 7 atau lebih baru gunakan
timeout
:sumber
-w
dalam milidetik,-n
hanya berapa kali melakukan ping dan waktu default antara ping adalah sedetik.Anda dapat menggunakan ping:
Ini akan menunggu 10 detik.
Alasan Anda harus menggunakan 11 adalah karena ping pertama langsung keluar, bukan setelah satu detik. Jumlahnya harus selalu satu lebih dari jumlah detik yang ingin Anda tunggu.
Perlu diingat bahwa tujuan dari
-w
tidak menunggu satu detik. Ini untuk memastikan bahwa Anda menunggu tidak lebih dari satu detik jika ada masalah jaringan.ping
sendiri akan mengirim satu paket ICMP per detik. Ini mungkin tidak diperlukan untuk localhost, tetapi kebiasaan lama sulit.sumber
-w
bahwa timeout (walaupun saya akui beberapa orang mungkin menyimpulkan bahwa karena ketidakjelasan saya), ini sebenarnya digunakan untuk membatasi waktu siklus di mana ada masalah jaringan yang akan menyebabkan setiap siklus mengambil lebih dari yang dialokasikan kedua. Saya telah menambahkan paragraf di bagian akhir untuk memperjelas hal ini.Ada cara yang lebih baik untuk tidur menggunakan ping. Anda akan ingin melakukan ping 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 semata-mata tidak ada (mungkin tidak jelas, tetapi berlaku bahkan di jaringan lokal):Untuk tidur selama 123 milidetik, gunakan
ping 192.0.2.1 -n 1 -w 123 >nul
sumber
-n
parameter.ping 192.0.2.1
pada PC Windows ini dan dapat dilihat bahwa Windows TCP / IP stack menjawab permintaan echo. Berapa banyak orang yang tahu bahwa 192.0.2.0/24 tidak boleh digunakan untuk alamat IPv4 statis?127.255.255.255
karena itu menjadi alamat loopback broadcast di Windows yang sudah ditetapkan secara default (Anda dapat mengonfirmasi ini dengan menjalankanroute print
di cmd dan melihat melalui tabel rute IPv4 yang dicetaknya).Jika Anda memiliki PowerShell di sistem Anda, Anda bisa menjalankan perintah ini:
Sunting: dari jawaban saya di utas yang sama , orang-orang mengangkat masalah di mana jumlah waktu yang dibutuhkan untuk memulai adalah signifikan dibandingkan dengan berapa lama Anda mencoba untuk menunggu. Jika keakuratan waktu tunggu penting (mis. Keterlambatan satu atau dua detik tidak dapat diterima), Anda dapat menggunakan pendekatan ini:
Ini membutuhkan waktu ketika perintah windows dikeluarkan, dan skrip PowerShell tidur hingga 5 detik setelah waktu itu. Jadi selama PowerShell membutuhkan waktu lebih sedikit untuk memulai dari pada durasi tidur Anda, pendekatan ini akan berhasil (sekitar 600 ms pada mesin saya).
sumber
Misalnya, untuk membuat skrip melakukan menunggu 2 detik tanpa gangguan:
Yang berarti skrip akan menunggu 2 detik sebelum melanjutkan.
Secara default, penekanan tombol akan mengganggu batas waktu, jadi gunakan
/nobreak
sakelar jika Anda tidak ingin pengguna dapat mengganggu (membatalkan) penantian. Selain itu, batas waktu akan memberikan notifikasi per detik untuk memberi tahu pengguna berapa lama waktu yang tersisa untuk menunggu; ini dapat dihapus dengan memipipkan perintah keNUL
.sunting: Seperti yang ditunjukkan @martineau dalam komentar ,
timeout
perintah hanya tersedia pada Windows 7 dan di atasnya. Selanjutnya,ping
perintah tersebut menggunakan waktu prosesor lebih sedikit daripadatimeout
. Saya masih percaya menggunakantimeout
jika memungkinkan, karena lebih mudah dibaca daripadaping
'retas'. Baca lebih lanjut di sini .sumber
ping
pendekatan tersebut menggunakan lebih sedikit waktu prosesor.Cukup letakkan ini di file batch Anda di mana Anda ingin menunggu.
sumber
Di Notepad, tulis:
Sekarang simpan sebagai wait.bat di folder C: \ WINDOWS \ System32, lalu kapan pun Anda ingin menunggu, gunakan:
sumber
ping
sesuatu yang tidak hanya sekali, dan menggunakan-w Timeout
opsi untuk waktu tunda dalam milidetik daripada opsi-n Count
jumlah total coba lagi.-w Timeout
mungkin lebih baik, tetapi saya memastikan ping sekali lagi daripada waktu yang dimasukkan.The Resource Kit selalu disertakan ini. Setidaknya sejak Windows 2000.
Juga, paket Cygwin memiliki
sleep
- plop itu ke PATH Anda dan sertakancygwin.dll
(atau apa pun namanya) dan cara untuk pergi!sumber
Saya suka tanggapan Aacini . Saya menambahkannya untuk menangani hari dan juga memungkinkannya untuk menangani centisecond (
%TIME%
keluaranH:MM:SS.CC
):sumber
Saya telah menggunakan program tidur C # ini. Mungkin lebih nyaman bagi Anda jika C # adalah bahasa pilihan Anda:
sumber
Bahkan lebih ringan daripada solusi Python adalah Perl one-liner.
Untuk tidur selama tujuh detik, letakkan ini di skrip BAT:
Solusi ini hanya menyediakan resolusi satu detik.
Jika Anda membutuhkan resolusi lebih tinggi maka gunakan modul Time :: HiRes dari CPAN. Ini menyediakan
usleep()
yang tidur dalam mikrodetik dannanosleep()
yang tidur dalam nanodetik (kedua fungsi hanya mengambil argumen integer). Lihat pertanyaan Stack Overflow Bagaimana saya tidur selama satu milidetik di Perl? untuk keterangan lebih lanjut.Saya telah menggunakan ActivePerl selama bertahun-tahun. Sangat mudah untuk menginstal.
sumber
Atau baris perintah Python, misalnya, selama 6 setengah detik:
sumber
Penggunaan ping itu bagus, selama Anda hanya ingin "menunggu sebentar". Ini karena Anda bergantung pada fungsi lain di bawahnya, seperti jaringan Anda berfungsi dan fakta bahwa tidak ada jawaban pada 127.0.0.1. ;-) Mungkin sangat tidak mungkin gagal, tetapi bukan tidak mungkin ...
Jika Anda ingin memastikan bahwa Anda menunggu tepat waktu yang ditentukan, Anda harus menggunakan
sleep
fungsionalitas (yang juga memiliki keuntungan karena tidak menggunakan daya CPU atau menunggu jaringan menjadi siap).Untuk menemukan yang sudah bisa dieksekusi untuk tidur adalah cara yang paling nyaman. Masukkan saja ke folder Windows Anda atau bagian lain dari jalur standar Anda dan selalu tersedia.
Jika tidak, jika Anda memiliki lingkungan kompilasi Anda dapat dengan mudah membuatnya sendiri. The
Sleep
Fungsi tersedia dalamkernel32.dll
, sehingga Anda hanya perlu menggunakan satu itu. :-) Untuk VB / VBA mendeklarasikan yang berikut di awal sumber Anda untuk mendeklarasikan fungsi sleep:Untuk C #:
Anda akan menemukan di sini lebih lanjut tentang fungsi ini (tersedia sejak Windows 2000) di fungsi Tidur (MSDN).
Dalam standar C,
sleep()
termasuk dalam pustaka standar dan dalam Visual Studio C Microsoft fungsi bernamaSleep()
, jika ingatanku. ;-) Keduanya mengambil argumen dalam hitungan detik, bukan dalam milidetik seperti dua deklarasi sebelumnya.sumber
Solusi terbaik yang harus bekerja pada semua versi Windows setelah Windows 2000 adalah:
sumber
'timeout' is not recognized as an internal or external command, operable program or batch file.
Pathping.exe dapat tidur kurang dari sedetik.
.
sumber
Saya terkesan dengan yang satu ini:
http://www.computerhope.com/batch.htm#02
Secara teknis, Anda memberi tahu
choice
perintah untuk hanya menerima y. Ini default ke y, untuk melakukannya dalam 5 detik, untuk tidak menarik prompt, dan untuk membuang apa pun yang dikatakannya ke NUL (seperti terminal nol di Linux).sumber
CHOICE
versi yang saya tahu, jika seseorang menekan kunci sambil menunggu, yang kadang-kadang dilakukan oleh orang-orang yang tidak sabar, maka pilihan akan membaca input, memberikan bunyi bip sistem untuk input yang buruk, dan menghentikan hitungan mundur, sehingga akan menggantung kecuali mereka menekan Y. Dan jika mereka hanya mendorong Y, maka pilihan berakhir di sana daripada menunggu 5. Juga, pilihan ini menggunakan sintaks Vista yang sangat aneh. Perintah pilihan normal malah digunakanCHOICE /T:Y,5 > NUL
untuk itu. (Tidak ada flag / D di versi lama.) Dan jika Anda memiliki Vista, gunakanTIMEOUT
saja.Anda juga dapat menggunakan file .vbs untuk melakukan timeout spesifik:
Kode di bawah ini membuat file .vbs. Letakkan ini di dekat bagian atas kode rbatch Anda:
Kode di bawah ini kemudian membuka .vbs dan menentukan berapa lama untuk menunggu:
Dalam kode di atas, "1000" adalah nilai waktu tunda untuk dikirim ke file .vbs dalam milidetik, misalnya, 1000 ms = 1 dtk. Anda dapat mengubah bagian ini sebanyak yang Anda inginkan.
Kode di bawah ini menghapus file .vbs setelah Anda selesai. Letakkan ini di akhir file batch Anda:
Dan di sini adalah kode semuanya sehingga mudah untuk menyalin:
sumber
Dari Windows Vista pada Anda memiliki perintah TIMEOUT dan SLEEP , tetapi untuk menggunakannya pada Windows XP atau Windows Server 2003, Anda memerlukan kit alat sumber daya Windows Server 2003 .
Di sini Anda memiliki gambaran umum alternatif tidur yang baik (pendekatan ping adalah yang paling populer karena akan bekerja pada setiap mesin Windows), tetapi ada (setidaknya) yang tidak disebutkan yang (ab) menggunakan perintah
W32TM
(Layanan Waktu):Di mana Anda harus mengganti N dengan detik yang ingin Anda jeda. Juga, ini akan bekerja pada setiap sistem Windows tanpa prasyarat.
Typeperf juga dapat digunakan:
Dengan mshta dan javascript (dapat digunakan untuk tidur di bawah satu detik):
Ini harus lebih tepat (untuk menunggu di bawah satu detik) - self executable yang dapat dikompilasi bergantung pada
.net
:sumber
Ada banyak cara untuk mencapai ' tidur ' dalam cmd / batch:
Favorit saya:
Ini akan menghentikan konsol selama 5 detik, tanpa output apa pun.
Paling sering digunakan:
Ini akan mencoba membuat koneksi hingga
localhost
5 kali. Karena di-host di komputer Anda, itu akan selalu mencapai host, sehingga setiap detik akan mencoba yang baru setiap detik. The-n
flag menunjukkan berapa kali script akan mencoba koneksi. Dalam hal ini adalah 5, sehingga akan bertahan 5 detik.Varian yang terakhir:
Dalam skrip ini ada beberapa perbedaan membandingkannya dengan yang terakhir. Ini tidak akan mencoba menelepon
localhost
. Sebaliknya, itu akan mencoba untuk terhubung ke1.1.1.1
, situs web yang sangat cepat. Aksi akan berlangsung 5 detik hanya jika Anda memiliki koneksi internet aktif. Jika tidak, maka akan berlangsung sekitar 15 untuk menyelesaikan tindakan . Saya tidak merekomendasikan menggunakan metode ini.Ini persis sama dengan contoh 2 (paling banyak digunakan). Anda juga dapat menggunakan:
Ini sebagai gantinya, menggunakan
localhost
versi IPv6 .Ada banyak metode untuk melakukan tindakan ini. Namun, saya lebih suka metode 1 untuk Windows Vista dan versi yang lebih baru dan metode yang paling banyak digunakan (metode 2) untuk versi OS yang lebih lama.
sumber
Anda bisa menjadi mewah dengan meletakkan pesan PAUSE di bilah judul:
sumber
Ini diuji pada Windows XP SP3 dan Windows 7 dan menggunakan CScript. Saya memasukkan beberapa penjaga yang aman untuk menghindari "" desakan. (
/q
akan berbahaya)Tunggu sebentar
Tunggu 500 ms dan kemudian jalankan barang setelah:
sleepOrDelayExecution.bat:
sumber
Karena yang lain menyarankan program pihak ketiga (Python, Perl, aplikasi khusus, dll), opsi lain adalah GNU CoreUtils untuk Windows yang tersedia di http://gnuwin32.sourceforge.net/packages/coreutils.htm .
2 opsi untuk penempatan:
Salah satu manfaat dari penerapan CoreUtils adalah Anda juga akan mendapatkan sejumlah program lain yang membantu pembuatan skrip (Windows batch meninggalkan banyak hal yang diinginkan).
sumber