Podczas pisania pliku wsadowego w celu zautomatyzowania czegoś na komputerze z systemem Windows musiałem wstrzymać jego wykonanie na kilka sekund (zwykle w pętli test / czekanie, czekając na rozpoczęcie procesu). W tamtym czasie najlepszym rozwiązaniem, jakie znalazłem, jest ping (nie żartuję), aby osiągnąć pożądany efekt. Znalazłem tutaj lepszy opis tego , który opisuje wywoływany plik „wait.bat”, zaimplementowany w następujący sposób:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Następnie możesz zawrzeć wywołania wait.bat we własnym pliku wsadowym, przekazując liczbę sekund uśpienia.
Najwyraźniej zestaw Windows 2003 Resource Kit zawiera polecenie usypiania podobne do uniksowego (w końcu!). W międzyczasie, dla tych z nas, którzy nadal używają Windows XP, Windows 2000 lub (niestety) Windows NT , czy istnieje lepszy sposób?
Zmodyfikowałem sleep.py
skrypt w akceptowanej odpowiedzi , aby domyślnie ustawiał jedną sekundę, jeśli w linii poleceń nie są przekazywane żadne argumenty:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
źródło
ping
polecenia lub pobierz zestaw zasobów systemu Windows, który zawierasleep
polecenie. Więcej szczegółów tutaj: Plik wsadowy SLEEP CommandOdpowiedzi:
AKTUALIZACJA
timeout
Polecenia, dostępny z systemem Windows Vista i dalej należy stosować polecenie, jak opisano w innej odpowiedzi na to pytanie. Poniżej znajduje się stara odpowiedź.Stara odpowiedź
Jeśli masz zainstalowany Python lub nie masz nic przeciwko zainstalowaniu go (ma też inne zastosowania :), po prostu utwórz następujący skrypt sleep.py i dodaj go gdzieś w swojej PATH:
Pozwoli to na przerwy poniżej sekundy (na przykład 1,5 sek., 0,1 itd.), Jeśli zajdzie taka potrzeba. Jeśli chcesz nazwać to
sleep
raczej niżsleep.py
, możesz dodać.PY
rozszerzenie do zmiennej środowiskowej PATHEXT. W systemie Windows XP możesz go edytować w:Mój komputer → Właściwości (menu) → Zaawansowane (zakładka) → Zmienne środowiskowe (przycisk) → Zmienne systemowe (ramka)
źródło
timeout
Komenda jest dostępna począwszy od systemu Windows Vista:Uwaga: nie działa z przekierowaniem danych wejściowych - trywialny przykład:
źródło
timeout
, dodane przez @Cristian Ciupitu, jest częściowo błędne - Windows XP nie posiada tej komendy.Używając
ping
opisanej metody, robię to, gdy nie mogę (lub nie chcę) dodawać więcej plików wykonywalnych lub instalować innego oprogramowania.Powinieneś pingować coś, czego nie ma, i używać
-w
flagi, aby po tym czasie nie powiodło się, a nie pingować razy coś, co tam jest (na przykład localhost)-n
. Pozwala to na obsługę czasu krótszego niż sekunda i myślę, że jest to nieco dokładniejsze.na przykład
(sprawdź, czy wersja 1.1.1.1 nie została podjęta)
źródło
PING: transmit failed. General failure.
1.1.1.1
jest pobierane przez CloudFlare, więc nie będzie to czekać 15 sekund, ale około kilku ms.SLEEP.exe
jest częścią większości zestawów zasobów, np . zestawu Windows Server 2003 Resource Kit, który można zainstalować również w systemie Windows XP.źródło
Nie zgadzam się z odpowiedziami, które tutaj znalazłem.
Używam następującej metody całkowicie opartej na możliwościach systemu Windows XP, aby zrobić opóźnienie w pliku wsadowym:
OPÓŹNIENIE BAT:
Możesz również wstawić dzień do obliczenia, aby metoda działała również wtedy, gdy interwał opóźnienia przekroczy północ.
źródło
TIME
poleceniu.%TIME%
do oddzielenia centisekund zamiast kropki używasz przecinka! Po prostu dodaj przecinek wDELIMS=:.,"
...Miałem podobny problem, ale właśnie uruchomiłem bardzo krótką aplikację konsolową C ++, aby zrobić to samo. Po prostu uruchom MySleep.exe 1000 - być może łatwiejsze niż pobranie / zainstalowanie całego zestawu zasobów.
źródło
W przypadku błędu serwera zadano podobne pytanie , a rozwiązanie było:
źródło
CHOICE
wersjach, które znam, jeśli ktoś w oczekiwaniu naciśnie przycisk, co czasami robią niecierpliwi ludzie, to wybór zarejestruje wejście, wyda sygnał dźwiękowy systemu dla złego wejścia i zatrzyma licznik czasu, co oznacza, że się zawiesi tam, chyba że nacisną N lub Y. A jeśli zdarzy się, że wcisną jedno z tych dwóch, wybór kończy się właśnie w tym miejscu, zamiast czekać na 5. Poza tym ten wybór wykorzystuje naprawdę dziwną składnię Visty. Zamiast tego używałybyCHOICE /T:Y,5 > NUL
do tego wszystkie zwykłe polecenia wyboru . W/D
starszych wersjach nie ma flagi./C:YN
lub po prostu/C:Y
, to nie zadziała, jeśli ktoś ma, powiedzmy, szwedzką komendę wyboru, która prawdopodobnie domyślnie wykona [J, N]. Więc to jest pogrążone w różnego rodzaju kłopotach.Możesz użyć warstwy WSH cscript systemu Windows i tego pliku JavaScript wait.js :
źródło
W zależności od potrzeb dotyczących zgodności użyj
ping
:np. odczekać 5 sekund, użyć
lub w systemie Windows 7 lub nowszym użyj
timeout
:źródło
-w
jest w milisekundach,-n
to po prostu liczba wykonań polecenia ping, a domyślny czas między pingami to sekunda.Możesz użyć ping:
Poczeka 10 sekund.
Powodem, dla którego musisz użyć 11, jest to, że pierwszy ping znika natychmiast, a nie po jednej sekundzie. Liczba powinna zawsze być o jeden większa niż liczba sekund, które chcesz czekać.
Pamiętaj, że celem tego
-w
nie jest czekanie ani sekundy. Ma to na celu zapewnienie, że nie będziesz czekać dłużej niż jedną sekundę w przypadku problemów z siecią.ping
samodzielnie wysyła jeden pakiet ICMP na sekundę. Prawdopodobnie nie jest to wymagane w przypadku hosta lokalnego, ale stare nawyki ciężko umierają.źródło
-w
limit czasu (chociaż przyznaję, że niektórzy mogą wywnioskować, że z powodu mojego braku jasności), w rzeczywistości jest używany do ograniczenia czasu cyklu, w którym występują problemy z siecią, które spowodowałyby, że każdy cykl zająłby więcej niż przydzielony druga. Dodałem akapit na końcu, aby to wyjaśnić.Jest lepszy sposób na spanie za pomocą pinga. Będziesz chciał pingować adres, który nie istnieje, więc możesz określić limit czasu z dokładnością do milisekund. Na szczęście taki adres jest zdefiniowany w standardzie (RFC 3330) i tak jest
192.0.2.x
. To nie jest zmyślone, to naprawdę jest adres, którego jedynym celem jest nieistnienie (może nie być jasne, ale dotyczy to nawet w sieciach lokalnych):Aby spać przez 123 milisekundy, użyj
ping 192.0.2.1 -n 1 -w 123 >nul
źródło
-n
parametru.ping 192.0.2.1
na tym komputerze z systemem Windows i widać, że stos TCP / IP systemu Windows odpowiada na żądania echa. Ile osób wie, że adres 192.0.2.0/24 nie powinien być używany jako statyczny adres IPv4?127.255.255.255
względu na to, że jest to adres transmisji zwrotnej w systemie Windows, który jest już domyślnie przypisany (możesz to potwierdzić uruchamiającroute print
w cmd i przeglądając tablicę tras IPv4, którą drukuje).Jeśli masz PowerShell w swoim systemie, możesz po prostu wykonać to polecenie:
Edycja: z mojej odpowiedzi w podobnym wątku ludzie podnieśli problem, w którym czas potrzebny do uruchomienia PowerShell jest znaczący w porównaniu z tym, jak długo próbujesz czekać. Jeśli dokładność czasu oczekiwania jest ważna (np. Sekunda lub dwie dodatkowe opóźnienia są niedopuszczalne), możesz zastosować następujące podejście:
Zajmuje to czas, gdy polecenie systemu Windows zostało wydane, a skrypt PowerShell pozostaje w stanie uśpienia do 5 sekund po tym czasie. Tak długo, jak uruchomienie programu PowerShell zajmuje mniej czasu niż czas snu, takie podejście będzie działać (na moim komputerze jest to około 600 ms).
źródło
Na przykład, aby skrypt wykonywał nieprzerywalne 2-sekundowe oczekiwanie:
Oznacza to, że skrypt będzie czekał 2 sekundy przed kontynuowaniem.
Domyślnie naciśnięcie klawisza przerwie limit czasu, więc użyj
/nobreak
przełącznika, jeśli nie chcesz, aby użytkownik mógł przerwać (anulować) oczekiwanie. Ponadto limit czasu zapewni powiadomienia na sekundę, aby powiadomić użytkownika, jak długo ma czekać; można to usunąć, przesyłając polecenie potokiem doNUL
.edycja: jak @martineau wskazuje w komentarzach ,
timeout
polecenie jest dostępne tylko w systemie Windows 7 i nowszych. Ponadtoping
polecenie zużywa mniej czasu procesora niżtimeout
. Nadal jednak wierzę w używanie gotimeout
tam, gdzie to możliwe, ponieważ jest bardziej czytelny niżping
„hack”. Przeczytaj więcej tutaj .źródło
ping
podejście to zużywa mniej czasu procesora.Po prostu umieść to w pliku wsadowym tam, gdzie chcesz poczekać.
źródło
W Notatniku napisz:
Teraz zapisz jako wait.bat w folderze C: \ WINDOWS \ System32, a następnie, gdy chcesz czekać, użyj:
źródło
ping
coś nie tylko raz i użyć-w Timeout
opcji dla czasu opóźnienia w milisekundach, a nie opcji-n Count
całkowitej liczby ponownych prób.-w Timeout
może być lepsze, ale upewniłem się, że pinguje jeszcze raz niż podany czas.Resource Kit zawsze włączone to. Przynajmniej od Windows 2000.
Ponadto pakiet Cygwin zawiera
sleep
- włóż to do swojej ŚCIEŻKI i dołączcygwin.dll
(lub jakkolwiek to się nazywa) i sposób!źródło
Podoba mi się odpowiedź Aaciniego . Dodałem do tego, aby obsługiwać dzień, a także włączać obsługę centisekund (
%TIME%
wyjściaH:MM:SS.CC
):źródło
Używam tego programu do snu w języku C #. Może być wygodniej, jeśli preferujesz język C #:
źródło
Jeszcze lżejszy niż rozwiązanie w Pythonie jest jednolinijkowy Perl.
Aby spać na siedem sekund, umieść to w skrypcie BAT:
To rozwiązanie zapewnia rozdzielczość tylko jednej sekundy.
Jeśli potrzebujesz wyższej rozdzielczości, użyj modułu Time :: HiRes firmy CPAN. Podaje,
usleep()
który śpi w mikrosekundach, ananosleep()
który w nanosekundach (obie funkcje przyjmują tylko argumenty całkowite). Zobacz pytanie o przepełnienie stosu Jak przespać milisekundę w Perlu? dla dalszych szczegółów.Korzystam z ActivePerl od wielu lat. Jest bardzo łatwy w montażu.
źródło
Lub na przykład Python z wiersza poleceń przez 6 i pół sekundy:
źródło
Użycie polecenia ping jest dobre, o ile chcesz tylko „chwilę poczekać”. Dzieje się tak, ponieważ jesteś zależny od innych funkcji pod spodem, takich jak praca sieci i fakt, że nic nie odpowiada na 127.0.0.1. ;-) Może mało prawdopodobne, że się nie uda, ale nie jest to niemożliwe ...
Jeśli chcesz mieć pewność, że czekasz dokładnie przez określony czas, powinieneś skorzystać z
sleep
funkcji (która ma również tę zaletę, że nie zużywa mocy procesora ani nie czeka, aż sieć będzie gotowa).Najwygodniejszym sposobem jest znalezienie już utworzonego pliku wykonywalnego do uśpienia. Po prostu upuść go do folderu Windows lub dowolnej innej części standardowej ścieżki i jest zawsze dostępny.
W przeciwnym razie, jeśli masz środowisko kompilacyjne, możesz je łatwo stworzyć samodzielnie. Ta
Sleep
funkcja jest dostępna w programiekernel32.dll
, więc wystarczy jej użyć. :-) Dla VB / VBA zadeklaruj na początku źródła, co następuje, aby zadeklarować funkcję uśpienia:Dla C #:
Więcej informacji na temat tej funkcji (dostępnej od Windows 2000) w funkcji uśpienia (MSDN) znajdziesz tutaj.
W standardowym C
sleep()
jest zawarta w bibliotece standardowej, aw Visual Studio C firmy Microsoft funkcja nosi nazwęSleep()
, jeśli pamięć mi służy. ;-) Te dwa przyjmują argument w sekundach, a nie w milisekundach, jak dwie poprzednie deklaracje.źródło
Najlepszym rozwiązaniem, które powinno działać na wszystkich wersjach systemu Windows po Windows 2000, byłoby:
źródło
'timeout' is not recognized as an internal or external command, operable program or batch file.
Plik pathping.exe może spać krócej niż sekundę.
.
źródło
Jestem pod wrażeniem tego:
http://www.computerhope.com/batch.htm#02
Technicznie rzecz biorąc,
choice
nakazujesz komendę zaakceptować tylko y. Domyślnie jest to y, aby zrobić to w ciągu 5 sekund, aby nie rysować monitu i zrzucać wszystko, co powie, do NUL (jak null terminal w Linuksie).źródło
CHOICE
wersjach, które znam, jeśli ktoś naciśnie klawisz podczas oczekiwania, co czasami robią niecierpliwi ludzie, wtedy wybór odczyta wejście, wyda sygnał dźwiękowy systemu dla złego wejścia i zatrzyma odliczanie, więc zawiesi się, chyba że naciśną Y. A jeśli zdarzy się, że naciśną Y, wtedy wybór kończy się właśnie na tym, zamiast czekać na 5. Ponadto ten wybór wykorzystuje naprawdę dziwną składnię Visty. Do tego służą zwykłe polecenia wyboruCHOICE /T:Y,5 > NUL
. (W starszych wersjach nie ma flagi / D). Jeśli masz Vista, użyjTIMEOUT
zamiast tego.Możesz również użyć pliku .vbs, aby wykonać określone limity czasu:
Poniższy kod tworzy plik .vbs. Umieść to w górnej części kodu partii:
Poniższy kod otwiera plik .vbs i określa, jak długo należy czekać:
W powyższym kodzie „1000” to wartość opóźnienia wysyłanego do pliku .vbs w milisekundach, na przykład 1000 ms = 1 s. Możesz zmienić tę część, aby była tak długa, jak chcesz.
Poniższy kod usuwa plik .vbs po zakończeniu pracy. Umieść to na końcu pliku wsadowego:
A oto cały kod, więc łatwo go skopiować:
źródło
Począwszy od systemu Windows Vista masz polecenia TIMEOUT i SLEEP , ale aby ich używać w systemie Windows XP lub Windows Server 2003, potrzebujesz zestawu narzędzi zasobów systemu Windows Server 2003 .
Tutaj masz dobry przegląd alternatywnych opcji uśpienia (metoda ping jest najpopularniejsza, ponieważ będzie działać na każdym komputerze z systemem Windows), ale nie wspomniano (przynajmniej) o jednej, która (ab) używa polecenia
W32TM
(Usługa czasu):Gdzie powinieneś zamienić N na sekundy, które chcesz zatrzymać. Ponadto będzie działać na każdym systemie Windows bez wymagań wstępnych.
Można również użyć Typeperf:
Z mshta i javascript (może być używany do snu poniżej sekundy):
Powinno to być jeszcze bardziej precyzyjne (dla oczekiwania poniżej sekundy) - samokompilujący się plik wykonywalny oparty na
.net
:źródło
Istnieje wiele sposobów na to, aby zasnąć `` '' w cmd / partia:
Mój ulubiony:
Spowoduje to zatrzymanie konsoli na 5 sekund bez żadnego wyjścia.
Najbardziej używane:
To spróbuje nawiązać połączenie do
localhost
5 razy. Ponieważ jest hostowany na twoim komputerze, zawsze dociera do hosta, więc co sekundę będzie próbował nowego co sekundę. Plik-n
Flaga wskazuje, ile razy skrypt spróbuje nawiązać połączenie. W tym przypadku jest to 5, więc będzie to trwało 5 sekund.Warianty ostatniego:
W tym skrypcie istnieją pewne różnice w porównaniu z ostatnim. To nie będzie próbowało zadzwonić
localhost
. Zamiast tego spróbuje połączyć się1.1.1.1
z bardzo szybką witryną. Akcja potrwa 5 sekund tylko wtedy, gdy masz aktywne połączenie internetowe. W przeciwnym razie ukończenie akcji potrwa około 15 . Nie polecam korzystania z tej metody.To jest dokładnie to samo, co w przykładzie 2 (najczęściej używane). Możesz również użyć:
Zamiast tego używa
localhost
wersji IPv6 .Istnieje wiele metod wykonania tej czynności. Jednak preferuję metodę 1 dla systemu Windows Vista i nowszych wersji oraz najczęściej używaną metodę (metodę 2) dla wcześniejszych wersji systemu operacyjnego.
źródło
Możesz nabrać ochoty, umieszczając wiadomość PAUSE na pasku tytułowym:
źródło
Zostało to przetestowane w systemie Windows XP SP3 i Windows 7 i używa CScript. Umieściłem kilku bezpiecznych strażników, aby uniknąć podpowiedzi „” del. (
/q
byłoby niebezpieczne)Poczekaj sekundę:
Poczekaj 500 ms, a następnie uruchom program po:
sleepOrDelayExecution.bat:
źródło
Ponieważ inni sugerują programy innych firm (Python, Perl, niestandardowa aplikacja itp.), Inną opcją jest GNU CoreUtils dla Windows dostępne pod adresem http://gnuwin32.sourceforge.net/packages/coreutils.htm .
2 opcje wdrożenia:
Jedną z korzyści z wdrożenia CoreUtils jest to, że dodatkowo otrzymasz wiele innych programów, które są pomocne w tworzeniu skryptów (wsad systemu Windows pozostawia wiele do życzenia).
źródło