Bir toplu iş dosyasında nasıl uyuyabilirim?


132

Windows toplu iş dosyasında bir komutla bir sonraki komut arasında yürütmeyi bir süre için nasıl duraklatabilirim?


Bunun kanonik olması mı amaçlanıyor? Öyleyse açıklayıcı bir metin uygun olabilir.
John Gardeniers

2
"Açıklayıcı metin" de olduğu gibi?
Massimo

2
Hepsi değilse de, gördüğüm kanonik sorular bu sorunun amacını tanımlayan metni içerir.
John Gardeniers 27:12

Ya da durumu açıklayan bir metin ... Çoğunlukla SEO konusunda yardımcı olmakla kalmayıp, aynı zamanda olası Cevapları çerçevelemeye de yardımcı olur.
Chris S

2
SEO iyi çalışıyor. Google aramada benim için ilk hit.
jbo5112

Yanıtlar:


194

Bir toplu iş dosyasında uyumanın doğru yolu timeout, Windows 2000'de verilen komutu kullanmaktır .

29 ila 30 saniye arasında bir yerde beklemek için :

timeout /t 30

Kullanıcı herhangi bir tuşa basarsa zaman aşımı kesintiye uğrar; ancak, komut ayrıca /nobreak, kullanıcının açıkça basabileceği herhangi bir şeyi etkin biçimde görmezden gelen isteğe bağlı anahtarı da kabul eder CTRL-C:

timeout /t 30 /nobreak

Ek olarak, komutun geri sayımını ekranda yazdırmasını istemiyorsanız, çıktısını aşağıdakilere yönlendirebilirsiniz NUL:

timeout /t 30 /nobreak > NUL

6
Zaman aşımı komutu, yüklü 2003 Kaynak seti ile bile Windows XP ile çalışmaz ve uyku komutu Windows 7'de çalışmaz; bu nedenle, hem Win7 hem de WinXP'de toplu iş dosyası kullanıyorsanız, ping komutu hala iyi bir şekilde kullanılabilir.

12
zaman aşımı etkileşimli olmayan komut dosyalarında çalışmaz: "HATA: Giriş yeniden yönlendirme desteklenmiyor, işlemden hemen çıkılıyor." bu yüzden bazen "ping" ile kesmek kullanmak tercih edilir.
iMysak

14

Burada da geçerli olduğu için cevabımı başka bir siteden kopyalayacağım .

Ping kullanmak istiyorsanız, daha iyi bir yol var. Var olmayan bir adrese ping atmak isteyeceksiniz, böylece milisaniye hassasiyetinde bir zaman aşımı belirtebilirsiniz. Neyse ki, böyle bir adres standartta tanımlanmaktadır (RFC 3330) ve öyledir 192.0.2.x. Bu telafi edilmemiştir, gerçekten var olmayan tek adresidir (net olmayabilir, ancak yerel ağlarda bile geçerlidir):

192.0.2.0/24 - Bu blok dokümantasyonda ve örnek kodda kullanılmak üzere "TEST-NET" olarak atanmıştır. Genellikle satıcı ve protokol belgelerinde domain.com example.com veya example.net alan adları ile birlikte kullanılır. Bu bloktaki adreslerin genel internet ortamında görünmemesi gerekir.

123 milisaniye boyunca uyumak için ping 192.0.2.1 -n 1 -w 123 >nul


3
Lütfen bunu yapmayın, gerçek bir adrese ping yapmaktan biraz daha iyidir. Pingsadece iş için yanlış bir araçtır.
Massimo

1
@Massimo Yapması amaçlanan şey değil, büyük olasılıkla :) :) Hala iyi bir çözüm olduğunu düşünüyorum - bazı senaryolarda zaman aşımından daha iyi sonuç veriyor (özellikle daha yüksek çözünürlükte). Ayrıca, oldukça iyi bilinir hale geldi, bu yüzden çoğu insan toplu iş dosyanızda gördüklerinde çok şaşırmayacaktı (örneğin kafası karışmış).
mafu

2
@Massimo Tamam! Sanırım sadece farklı görüşlerimiz var. Sakıncası yoksa, bu cevabı hala bırakacağım çünkü en sık tarif edildiği gibi n kez localhost'a ping yapmaktan daha iyi görünüyor.
mafu

7
zaman aşımı, çalıştığı işletim sistemleri için doğru çözümdür. ping, 5.1-6.3'te çalışan tek çözümdür. Sistemlerin% 25’i hala 5.1’de, zaman aşımı “doğru yol” değildir.
Wyrmwood

3
Zaman aşımı, herhangi bir işletim sistemi için yanlış bir çözümdür, çünkü Windows 10'da bile önemli ölçüde bozulmuştur. Giriş yalnızca yönlendirildiği için başarısız olan bir komut nedir?
Harry Johnston,

8

Ayrıca localhost'a bir ping ekleyebilirsiniz. Bu işlemin tamamlanması 4 saniye sürecektir (varsayılan olarak). Bazıları tarafından bir çamur olarak kabul edilir, ancak tamamen aynı şekilde çalışır.

Komut:
ping 127.0.0.1


6
Ehm ... bu soru ve cevapların amacı, kabul edilen cevapları olan diğer iki soruyu tam olarak düzeltmekti;
Massimo

6
İşe yarayacak bir çekiçle vida sürmeye eşdeğerdir. Yanlış bir araç işe yarayabilir, ancak yine de yanlış.
voretaq7

1
@MarkAllen Başka bir deyişle, Windows NT4, 95, 98, ME ve daha yaşlı?
Chris McKeown

5
@MarkAllen - teknik olarak daha sonra pingişletim sisteminizle gelip gelmediği konusunda endişelenmeniz gerekir. Eğer '95 '98 veya ME hakkında yeterince endişeleniyorsanız, o zaman pingda sahip olmadıkları 6.22 kadar endişeli olmalısınız
Mark Henderson

4
@MarkHenderson OS için belirli bir sürümün TCP / IP'yi destekleyip desteklemediğini hatırlamak daha kolay (benim için), daha önce duymadığım bir komut içerip içermediğini hatırlamaktan daha kolaydır. Bilirsin?
Mark Allen

2

Feragatname : Bu "ideal" bir çözüm değil, bu yüzden beni tavsiye edenlere yaptığı gibi başımın üstüne atmaya zahmet etmeyin ping...

Mümkün timeoutolduğunda , kesin kullanın . Ancak yorumlarda belirtildiği gibi, bu her zaman bir seçenek değildir (örneğin etkileşimli olmayan modda). Ondan sonra, ping"kludge" un belki de bir sonraki en iyi seçenek olduğuna katılıyorum , çünkü çok basit. Bu, başka bir seçenek teklif ediyorum ... bazı VB Komut Dosyalarını yerleştir .

Bu çözümün temeli, bunun ötesinde her türlü uygulamaya sahiptir. Çoğu zaman VBS, partinin yapamayacağı şeyleri yapabilir veya en azından bunu çok daha kolay bir şekilde yapabilir. Burada gösterilen tekniği kullanarak, ikisini karıştırabilirsiniz ("kesintisiz" değil, "işlevsel olarak" ...).

İşte bir geçici komut dosyası oluşturmak için bir liner, çalıştırmak, sonra silin. Senaryo sizin için uyuyor (bu örnekte 3 saniye boyunca).

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

İşte temelde aynı şey, biraz farklı yazılmış:

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

Ve sonunda, gibi ping, CScriptkendisi bir zaman aşımı seçeneği vardır! Bu nedenle, komut dosyasında sonsuz bir döngü girerseniz, tercümanın süreyi zorlamasını sağlayabilirsiniz. Bu işlemin CPU'yu yiyen "meşgul" bir işlem olduğunu ve bu nedenle WScript.Sleepprosedürü ne zaman kullanabileceğinizi önermiyorum , ancak tamamlama uğruna kavramsal bir seçenek olarak sunuyorum:

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

Bilirsin ... bunu powershell'de yapabilirsin, umarım bir dosya yazmaya gerek kalmadan.
Harry Johnston

Evet, bu muhtemelen başka bir iyi çözüm olsa da, bunun eski Windows sürümleriyle daha geriye uyumlu olduğuna inanıyorum.
BuvinJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.