Jak wstrzymać na chwilę wykonanie w pliku wsadowym systemu Windows między poleceniem a następnym?
Jak wstrzymać na chwilę wykonanie w pliku wsadowym systemu Windows między poleceniem a następnym?
Odpowiedzi:
Prawidłowym sposobem na uśpienie w pliku wsadowym jest użycie timeout
polecenia wprowadzonego w systemie Windows 2000.
Aby poczekać od 29 do 30 sekund :
timeout /t 30
Limit czasu zostanie przerwany, jeśli użytkownik naciśnie dowolny klawisz; jednak polecenie akceptuje również opcjonalny przełącznik /nobreak
, który skutecznie ignoruje wszystko, co użytkownik może nacisnąć, z wyjątkiem jawnego CTRL-C
:
timeout /t 30 /nobreak
Dodatkowo, jeśli nie chcesz, aby polecenie drukowało odliczanie na ekranie, możesz przekierować jego wynik do NUL
:
timeout /t 30 /nobreak > NUL
Ponieważ dotyczy to również tutaj, skopiuję moją odpowiedź z innej witryny .
Jeśli chcesz użyć polecenia ping, istnieje lepszy sposób. Będziesz chciał pingować adres, który nie istnieje, dzięki czemu możesz określić limit czasu z milisekundową precyzją. Na szczęście taki adres jest zdefiniowany w standardzie (RFC 3330) i tak jest 192.0.2.x
. To nie jest wymyślone, to naprawdę adres, którego jedynym celem jest nieistnienie (może nie być jasne, ale dotyczy nawet sieci lokalnych):
192.0.2.0/24 - Ten blok jest przypisany jako „TEST-NET” do wykorzystania w dokumentacji i przykładowym kodzie. Jest często używany w połączeniu z nazwami domen example.com lub example.net w dokumentacji dostawcy i protokołu. Adresy w tym bloku nie powinny pojawiać się w publicznym Internecie.
Aby spać przez 123 milisekundy, użyj ping 192.0.2.1 -n 1 -w 123 >nul
Ping
jest po prostu niewłaściwym narzędziem do pracy.
Możesz także wstawić polecenie ping do hosta lokalnego. Zajmie to 4 sekundy (domyślnie). Przez niektórych uważany jest za kludge, ale mimo to działa całkiem dobrze.
Polecenie:
ping 127.0.0.1
ping
system operacyjny jest dostępny. Jeśli martwisz się wystarczająco o '95 '98 lub ME, to powinieneś być równie zaniepokojeni 6.22, który nie posiada ping
albo
Oświadczenie : nie jest to „idealne” rozwiązanie, więc nie zawracaj mi głowy pobijaniem tego, co polecam ping
...
Jeśli to możliwe, użyj timeout
na pewno. Ale jak zauważono w komentarzach, nie zawsze jest to opcja (np. W trybie nieinteraktywnym). Po tym zgadzam się, że ping
„kludge” jest prawdopodobnie kolejną najlepszą opcją, ponieważ jest bardzo prosta. To powiedziawszy, oferuję inną opcję ... osadzić skrypt VB .
Podstawa tego rozwiązania ma wiele innych zastosowań. Często VBS potrafi robić rzeczy, których partia nie może, lub przynajmniej robi to z drastycznie większą łatwością. Korzystając z przedstawionej tutaj techniki, możesz je mieszać (nie „płynnie”, ale „funkcjonalnie” ...).
Oto jeden linijka, aby utworzyć skrypt tymczasowy, wykonać go, a następnie usunąć. Skrypt śpi dla ciebie (w tym przykładzie przez 3 sekundy).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Oto w zasadzie ta sama rzecz, napisana nieco inaczej:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
I wreszcie, jak ping
, CScript
sama posiada opcję limitu czasu! Tak więc, jeśli wejdziesz w nieskończoną pętlę w skrypcie, możesz pozwolić tłumaczowi na wymuszanie czasu trwania. Uwaga: jest to operacja „zajęta”, która zjada procesor, dlatego nie polecam jej, gdy można skorzystać z tej WScript.Sleep
procedury, ale przedstawiam ją jako koncepcyjną opcję ze względu na kompletność:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%