Tidur dalam file batch


151

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.pyskrip 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)

Halaman unduhan Microsoft pada Windows 2003 Resource Kit menunjukkan bahwa itu juga berfungsi untuk XP. Saya khawatir tidak ada pilihan lain selain menggunakan utilitas 'eksternal' untuk menunggu: tidak ada yang seperti ini yang tertanam dalam prosesor perintah XP.
GerG

Sumber daya kit 2003 server bekerja dengan Windows XP (dan mungkin dengan w2k)
Martin Beckett

Saya menghadapi masalah yang sama di masa lalu, dan menggunakan ping sendiri (dengan komentar di atas jelas mendokumentasikan bahwa saya menyadari ini bodoh :)).
Jack Leow


2
Anda memiliki beberapa opsi - meniru sleep dengan pingperintah, atau unduh kit sumber daya windows yang mencakup sleepperintah. Lebih detail di sini: File batch Perintah SLEEP
Rudu

Jawaban:


14

MEMPERBARUI

The timeoutperintah, 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:

import time, sys

time.sleep(float(sys.argv[1]))

Ini akan memungkinkan jeda sub-detik (misalnya, 1,5 detik, 0,1, dll.), Jika Anda memiliki kebutuhan seperti itu. Jika Anda ingin menyebutnya sleepbukan sleep.py, maka Anda dapat menambahkan .PYekstensi ke variabel lingkungan PATHEXT Anda. Pada Windows XP, Anda dapat mengeditnya di:

Komputer Saya → Properti (menu) → Lanjutan (tab) → Variabel Lingkungan (tombol) → Variabel sistem (bingkai)


32
mengapa kita harus menulis skrip dengan python ketika solusi batch-skrip diminta? Bagaimana ekstensi jalur dapat memecahkan masalah yang pengguna Windows tidak menginstal interpreter python? Terima kasih.
Val

6
Demi portabilitas, saya pikir solusi ini harus dihindari karena ada alternatif asli baik-baik saja.
Gras Double

1
Pendekatan ini mungkin telah memberikan solusi di masa lalu, tetapi solusi asli yang dijelaskan oleh @Blorgbeard jelas merupakan cara yang harus dilakukan.
Mike

227

The timeoutperintah tersedia dari Windows Vista dan seterusnya:

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

Catatan: Tidak berfungsi dengan pengalihan input - contoh sepele:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.

8
tidak berfungsi dalam penggunaan konsol-kurang: "GALAT: Pengalihan input tidak didukung, segera keluar dari proses."
simpleuser

Maksud saya adalah kasus di mana Anda tidak memiliki konsol sama sekali, seperti ketika file batch dijalankan di latar belakang melalui garpu dari beberapa proses lain, cygwin crontab, atau perintah ssh jarak jauh, dll.
simpleuser

1
Oh ya saya tahu. Contoh yang saya berikan adalah hanya untuk menunjukkan kesalahan :)
Blorgbeard keluar

3
The Link ke dokumentasi untuk timeout, ditambah dengan @Cristian Ciupitu, sebagian salah - Windows XP tidak memiliki perintah ini.
martineau

1
@ Halo Dunia yang terdengar seperti masalah dengan% PATH% Anda
Blorgbeard keluar

21

Menggunakan pingmetode 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 -wbendera sehingga gagal setelah jumlah waktu, bukan ping sesuatu yang adalah ada (seperti localhost) -nkali. 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)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL

Seketika kembali denganPING: transmit failed. General failure.
huysentruitw

IP 1.1.1.1diambil oleh CloudFlare, jadi ini tidak akan menunggu 15-an tetapi sekitar beberapa ms.
dhcgn

16

SLEEP.exetermasuk dalam sebagian besar Resource Kit mis . Windows Server 2003 Resource Kit yang dapat diinstal pada Windows XP juga.

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)

15

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:

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

Anda juga dapat memasukkan hari dalam perhitungan sehingga metode ini juga berfungsi ketika interval penundaan melewati tengah malam.


15
Ini harus akurat, tetapi ini adalah cara intensif CPU untuk melakukannya. Biasanya Anda menginginkan implementasi yang digerakkan oleh interupsi sehingga proses tersebut tidak mengkonsumsi siklus CPU saat menunggu. Ini seharusnya tidak menjadi masalah untuk menunggu pendek yang jarang terjadi, seperti yang mungkin terjadi pada kebanyakan situasi batch. Tetapi proses yang terus berjalan dengan menunggu lama bisa berdampak negatif pada kinerja sistem.
dbenham

4
Karena menggunakan jam sistem, akurasinya adalah satu detik. Jika 2 detik ditentukan, penundaan bisa antara 2 detik dan 3 detik (sebenarnya 2,99999 ... detik).
Peter Mortensen

Bagaimana jika waktunya sekarang 7:59:59 dan Anda ingin menunggu 7 detik? Ini sepertinya tidak memperhitungkannya.
ashes999

Ini menghabiskan lebih banyak waktu CPU daripada menghitung waktu sistem. Selain itu Anda melakukan operasi aritmatika dengan angka oktal, karena menit dan detik yang lebih kecil dari 10 ditampilkan dengan 0 di TIMEperintah.
Andreas

2
@ mrt: Masalahnya adalah Anda %TIME%menggunakan koma untuk memisahkan centisecond, bukan titik! Cukup tambahkan koma di DELIMS=:.,"...
Aacini

13

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.

#include <tchar.h>
#include <stdio.h>
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc == 2)
    {
        _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
        Sleep(_tstoi(argv[1]));
    }
    else
    {
        _tprintf(_T("Wrong number of arguments.\n"));
    }
    return 0;
}

10

Di Server Fault, pertanyaan serupa diajukan , dan solusinya adalah:

choice /d y /t 5 > nul

7
FYI: Pilihan tidak termasuk dalam Windows XP. Itu di Windows 9x, dihapus dari XP, dan ditambahkan kembali untuk Vista dan seterusnya.
Devin Burke

7
Saya tidak merekomendasikan ini sama sekali. Setidaknya dalam semua CHOICEversi 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 digunakan CHOICE /T:Y,5 > NULuntuk itu. Tidak ada /Dbendera di versi lama.
Pengodean Dengan Gaya

1
Sebagai tambahan, setidaknya perintah PILIHAN yang saya tahu memiliki tombol default ya / tidak berbeda berdasarkan bahasa yang digunakan, jadi jika Anda mengandalkan pilihan default [Y, N] alih-alih secara eksplisit menetapkannya dengan /C:YNatau 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.
Pengodean Dengan Gaya

1
@Coding Menguji ini di Win7, dan jika pengguna menekan tombol, itu akan berbunyi bip, namun masih akan habis setelah 5 detik tambahan setelah pengguna menekan tombol. Jadi jika pengguna terus menekan tombol, itu tidak akan pernah habis. Juga, dalam kasus saya, ketika saya menggunakan ini, saya percaya itu menyembunyikan konsol, sehingga pengguna tidak dapat menekan tombol. Pada sistem ini, tidak ada akses ke Python, tidak ada akses untuk menjatuhkan exe saya sendiri pada sistem (seperti yang disarankan dalam beberapa jawaban lain), saya cukup terbatas dalam apa yang bisa saya lakukan. Jadi, apa yang akan Anda rekomendasikan?
mlsteeves

@mlsteeves Setiap Windows, DOS, dll yang berbeda memiliki perintah pilihan yang berbeda dan seperti yang disebutkan biasanya tidak tersedia di Xp. Banyak perintah pilihan memiliki perilaku yang agak berbeda dan beberapa bahkan memiliki sintaks yang berbeda. Saya, saya biasanya menggunakan perintah ping ketika saya perlu tidur. Itu jelek, tapi bisa diandalkan.
Pengodean Dengan Gaya

9

Anda bisa menggunakan lapisan WSH cscript Windows dan file JavaScript wait.js ini :

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");

1
Host Windows Scripting dapat dinonaktifkan melalui kebijakan grup.
Joey

8

Tergantung pada kebutuhan kompatibilitas Anda, gunakan ping:

ping -n <numberofseconds+1> localhost >nul 2>&1

misal menunggu 5 detik, gunakan

ping -n 6 localhost >nul 2>&1

atau pada Windows 7 atau lebih baru gunakan timeout:

timeout 6 >nul

2
-wdalam milidetik, -nhanya berapa kali melakukan ping dan waktu default antara ping adalah sedetik.
Joey

8

Anda dapat menggunakan ping:

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:

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 -wtidak menunggu satu detik. Ini untuk memastikan bahwa Anda menunggu tidak lebih dari satu detik jika ada masalah jaringan. pingsendiri akan mengirim satu paket ICMP per detik. Ini mungkin tidak diperlukan untuk localhost, tetapi kebiasaan lama sulit.


tidak disarankan untuk menggunakan ini untuk pemrosesan waktu nyata yang kritis. karena perintah PING sedang digunakan, ada kemungkinan file batch TUNGGU ini dapat berjalan lebih dari beberapa milidetik
Wael Dalloul

12
@ Ya ampun, jika Anda berbicara tentang menunggu di batas satu detik, beberapa milidetik tidak akan relevan. Dan jika Anda menggunakan cmd.exe untuk hal-hal realtime, Anda layak semua yang Anda mendapatkan :-)
paxdiablo

-w adalah nilai batas waktu. Jumlah milidetik untuk menunggu balasan ... bukan jumlah waktu untuk menunggu di antara ping.
quux

@ quux, saya menyatakan -wbahwa 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.
paxdiablo

Masalahnya adalah jika ping kembali lebih cepat , Anda mungkin tidak menunggu satu detik penuh di antara ping. jadi loop tunggu Anda akan berakhir lebih cepat dari yang Anda kira
quux

7

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):

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 di 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


Ya, ini lebih mudah untuk ditulis dan dipahami daripada harus menambahkan satu ke -nparameter.
Peter Mortensen

Namun, saya telah mengukurnya (menggunakan 100 ping). Jika saya menggunakan -n 3 -w 124, waktu yang sebenarnya tepat (3 + 1) * (124 + 1) = 4 * 125 = 500 ms. Waktunya sangat stabil, tepat untuk resolusi 10 ms dalam pembacaan (oleh prompt CMD dengan waktu) - dan resolusi yang mendasarinya jelas lebih baik dari 10 ms (tidak terpengaruh oleh resolusi centang 16 ms yang biasa).
Peter Mortensen

@ mafu 192.0.2.0/24 yang tidak boleh digunakan tidak berarti itu tidak dapat digunakan dan karena itu tidak benar-benar dijamin bahwa tidak ada balasan pada permintaan gema. Misalnya, konfigurasikan untuk PC Windows mana saja alamat IPv4 statis 192.0.2.1 dan subnet mask 255.255.255.0 dan hubungkan adaptor jaringan ke perangkat lain. Sebuah saklar sederhana sudah cukup di mana tidak ada lagi yang terhubung. Kemudian jalankan ping 192.0.2.1pada 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?
Mofi

1
Per diskusi di komentar di sini , tampaknya 192.0.2.1 tidak terlalu mudah dan ada yang menyarankan bahwa 127.255.255.255 adalah pilihan yang lebih baik. Pikiran?
JLRishe

Komentar yang disebutkan dalam pos di atas sekarang telah dihapus (mungkin sebagai NLN), tetapi saya setuju dengan perubahan 127.255.255.255karena itu menjadi alamat loopback broadcast di Windows yang sudah ditetapkan secara default (Anda dapat mengonfirmasi ini dengan menjalankan route printdi cmd dan melihat melalui tabel rute IPv4 yang dicetaknya).
Hoppeduppeanut

6

Jika Anda memiliki PowerShell di sistem Anda, Anda bisa menjalankan perintah ini:

powershell -command "Start-Sleep -s 1"

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:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

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).


6
timeout /t <seconds> <options>

Misalnya, untuk membuat skrip melakukan menunggu 2 detik tanpa gangguan:

timeout /t 2 /nobreak >NUL

Yang berarti skrip akan menunggu 2 detik sebelum melanjutkan.

Secara default, penekanan tombol akan mengganggu batas waktu, jadi gunakan /nobreaksakelar 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 ke NUL.

sunting: Seperti yang ditunjukkan @martineau dalam komentar , timeoutperintah hanya tersedia pada Windows 7 dan di atasnya. Selanjutnya, pingperintah tersebut menggunakan waktu prosesor lebih sedikit daripada timeout. Saya masih percaya menggunakan timeoutjika memungkinkan, karena lebih mudah dibaca daripada ping'retas'. Baca lebih lanjut di sini .


2
Rupanya perintah ini hanya tersedia di Windows 7/2008 dan XP Resource Kit (dan mungkin 8 / 8.1). Sumber juga mengklaim pingpendekatan tersebut menggunakan lebih sedikit waktu prosesor.
martineau

5

Cukup letakkan ini di file batch Anda di mana Anda ingin menunggu.

@ping 127.0.0.1 -n 11 -w 1000 > null

Apa bedanya dengan jawaban paxdiablo?
Peter Mortensen

2
Tidak berbeda, tetapi jawaban di sini berasal dari beberapa pertanyaan yang digabungkan, jadi tidak semua jawaban ada ketika saya menjawab.
Brent Stewart

4

Di Notepad, tulis:

@echo off
set /a WAITTIME=%1+1
PING 127.0.0.1 -n %WAITTIME% > nul
goto:eof

Sekarang simpan sebagai wait.bat di folder C: \ WINDOWS \ System32, lalu kapan pun Anda ingin menunggu, gunakan:

CALL WAIT.bat <whole number of seconds without quotes>

Itu ping sendiri berulang kali, menunggu satu detik di antara setiap ping, dan kemudian kembali ke program panggilan, saya tidak melihat loop tak terbatas, tetapi saya telah mengujinya sendiri.
SuperKael

Kesalahan saya, tidak ada loop tak terbatas. Namun, seperti yang disebutkan dalam salah satu jawaban lain , lebih baik untuk pingsesuatu yang tidak hanya sekali, dan menggunakan -w Timeoutopsi untuk waktu tunda dalam milidetik daripada opsi -n Countjumlah total coba lagi.
martineau

-w Timeoutmungkin lebih baik, tetapi saya memastikan ping sekali lagi daripada waktu yang dimasukkan.
SuperKael

4

The Resource Kit selalu disertakan ini. Setidaknya sejak Windows 2000.

Juga, paket Cygwin memiliki sleep- plop itu ke PATH Anda dan sertakan cygwin.dll(atau apa pun namanya) dan cara untuk pergi!


2
Perhatikan bahwa cygwin1.dll tidak hidup berdampingan secara damai dengan versi yang berbeda dari dirinya sendiri. Lebih baik Anda memiliki satu dan hanya satu cygwin1.dll di mesin Anda, atau Anda akan mendapatkan kegagalan aneh.
JesperE

Kit Sumber Daya yang mana? Tampaknya ada lebih dari satu. Bisakah Anda memperbarui jawaban Anda?
Peter Mortensen

3

Saya suka tanggapan Aacini . Saya menambahkannya untuk menangani hari dan juga memungkinkannya untuk menangani centisecond ( %TIME%keluaran H:MM:SS.CC):

:delay
SET DELAYINPUT=%1
SET /A DAYS=DELAYINPUT/8640000
SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)

::Get ending centisecond (10 milliseconds)
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
SET /A DAYS=DAYS+ENDING/8640000
SET /A ENDING=ENDING-(DAYS*864000)

::Wait for such a centisecond
:delay_wait
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
SET LASTCURRENT=%CURRENT%
IF %CURRENT% LSS %ENDING% GOTO delay_wait
IF %DAYS% GTR 0 GOTO delay_wait
GOTO :EOF

3

Saya telah menggunakan program tidur C # ini. Mungkin lebih nyaman bagi Anda jika C # adalah bahasa pilihan Anda:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace sleep
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                double time = Double.Parse(args[0]);
                Thread.Sleep((int)(time*1000));
            }
            else
            {
                Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
            }
        }
    }
}

3

Bahkan lebih ringan daripada solusi Python adalah Perl one-liner.

Untuk tidur selama tujuh detik, letakkan ini di skrip BAT:

perl -e "sleep 7"

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 dan nanosleep()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.


2

Atau baris perintah Python, misalnya, selama 6 setengah detik:

python -c "import time;time.sleep(6.5)"

Meskipun lebih pendek, ini adalah duplikat dari jawaban yang diterima.
Peter Mortensen

@Peter Mortensen: Ini juga memungkinkan Anda untuk dengan mudah memasukkan semuanya ke dalam satu baris file batch.
martineau

2

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 SleepFungsi tersedia dalam kernel32.dll, sehingga Anda hanya perlu menggunakan satu itu. :-) Untuk VB / VBA mendeklarasikan yang berikut di awal sumber Anda untuk mendeklarasikan fungsi sleep:

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

Untuk C #:

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

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 bernama Sleep(), jika ingatanku. ;-) Keduanya mengambil argumen dalam hitungan detik, bukan dalam milidetik seperti dua deklarasi sebelumnya.


1
Tidur tersedia di framework .net - lihat kelas utasnya, misalnya: using System.Threading; .... Thread.Sleep (1000);
John Sibly

2
Jika "ping 127.0.0.1" gagal, Anda memiliki hal-hal yang lebih serius daripada "sleep" untuk dikhawatirkan - ini adalah antarmuka loopback, apa pun RPC mungkin akan menjadi gila.
Piskvor meninggalkan gedung

2

Solusi terbaik yang harus bekerja pada semua versi Windows setelah Windows 2000 adalah:

timeout numbersofseconds /nobreak > nul

Tidak berfungsi di XP Pro ...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau

1

Pathping.exe dapat tidur kurang dari sedetik.

@echo off
setlocal EnableDelayedExpansion 
echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!

.

> sleep 10
17:01:33,57
17:01:33,60

> sleep 20
17:03:56,54
17:03:56,58

> sleep 50
17:04:30,80
17:04:30,87

> sleep 100
17:07:06,12
17:07:06,25

> sleep 200
17:07:08,42
17:07:08,64

> sleep 500
17:07:11,05
17:07:11,57

> sleep 800
17:07:18,98
17:07:19,81

> sleep 1000
17:07:22,61
17:07:23,62

> sleep 1500
17:07:27,55
17:07:29,06

1

Saya terkesan dengan yang satu ini:

http://www.computerhope.com/batch.htm#02

choice /n /c y /d y /t 5 > NUL

Secara teknis, Anda memberi tahu choiceperintah 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).


3
Saya akan bergema di sini: Saya tidak merekomendasikan ini sama sekali. Dalam CHOICEversi 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 digunakan CHOICE /T:Y,5 > NULuntuk itu. (Tidak ada flag / D di versi lama.) Dan jika Anda memiliki Vista, gunakan TIMEOUTsaja.
Pengodean Dengan Gaya

1

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:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"

Kode di bawah ini kemudian membuka .vbs dan menentukan berapa lama untuk menunggu:

start /WAIT "" "%cd%\sleeper.vbs" "1000"

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:

del /f /q "%cd%\sleeper.vbs"

Dan di sini adalah kode semuanya sehingga mudah untuk menyalin:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
start /WAIT "" "%cd%\sleeper.vbs" "1000"
del /f /q "%cd%\sleeper.vbs"

1

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):

w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:N  >nul 2>&1

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:

typeperf "\System\Processor Queue Length" -si N -sc 1 >nul

Dengan mshta dan javascript (dapat digunakan untuk tidur di bawah satu detik):

start "" /wait /min /realtime mshta "javascript:setTimeout(function(){close();},5000)"

Ini harus lebih tepat (untuk menunggu di bawah satu detik) - self executable yang dapat dikompilasi bergantung pada .net:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
::del %~n0.exe /q /f
::
:: For precision better call this like
:: call waitMS 500
:: in order to skip compilation in case there's already built .exe
:: as without pointed extension first the .exe will be called due to the ordering in PATEXT variable
::
::
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /w:0 /out:"%~n0.exe" "%~dpsfnx0"
)


%~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Threading;

var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
    Console.WriteLine(arguments[0]+" N");
    Console.WriteLine(" N - milliseconds to wait");
    Environment.Exit(0);    
}

if(arguments.length<2){
    printHelp();
}

try{
    var wait:Int32=Int32.Parse(arguments[1]);
    System.Threading.Thread.Sleep(wait);
}catch(err){
    Console.WriteLine('Invalid Number passed');
    Environment.Exit(1);
}

1

Ada banyak cara untuk mencapai ' tidur ' dalam cmd / batch:

Favorit saya:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

Ini akan menghentikan konsol selama 5 detik, tanpa output apa pun.

Paling sering digunakan:

ping localhost -n 5 >NUL 2>NUL

Ini akan mencoba membuat koneksi hingga localhost5 kali. Karena di-host di komputer Anda, itu akan selalu mencapai host, sehingga setiap detik akan mencoba yang baru setiap detik. The -nflag menunjukkan berapa kali script akan mencoba koneksi. Dalam hal ini adalah 5, sehingga akan bertahan 5 detik.

Varian yang terakhir:

ping 1.1.1.1 -n 5 >nul

Dalam skrip ini ada beberapa perbedaan membandingkannya dengan yang terakhir. Ini tidak akan mencoba menelepon localhost. Sebaliknya, itu akan mencoba untuk terhubung ke 1.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.

ping 127.0.0.1 -n 5 >nul

Ini persis sama dengan contoh 2 (paling banyak digunakan). Anda juga dapat menggunakan:

ping [::1] -n 5 >nul

Ini sebagai gantinya, menggunakan localhostversi 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.


0

Anda bisa menjadi mewah dengan meletakkan pesan PAUSE di bilah judul:

@ECHO off
SET TITLETEXT=Sleep
TITLE %TITLETEXT%
CALL :sleep 5
GOTO :END
:: Function Section
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
 %%as&PING.exe -n 2 -w 1000 127.1>NUL)
EXIT /B 0
:: End of script
:END
pause
::this is EOF

0

Ini diuji pada Windows XP SP3 dan Windows 7 dan menggunakan CScript. Saya memasukkan beberapa penjaga yang aman untuk menghindari "" desakan. ( /qakan berbahaya)

Tunggu sebentar

sleepOrDelayExecution 1000

Tunggu 500 ms dan kemudian jalankan barang setelah:

sleepOrDelayExecution 500 dir \ /s

sleepOrDelayExecution.bat:

@echo off
if "%1" == "" goto end
if NOT %1 GTR 0 goto end
setlocal
set sleepfn="%temp%\sleep%random%.vbs"
echo WScript.Sleep(%1) >%sleepfn%
if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
cscript %sleepfn% >nul
if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
%params%
:end

0

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:

  1. Instal paket lengkap (yang akan mencakup paket lengkap CoreUtils, dependensi, dokumentasi, dll).
  2. Instal hanya binary 'sleep.exe' dan dependensi yang diperlukan (gunakan depend.exe untuk mendapatkan dependensi).

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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.