Centrum Skryptów - Systemy Operacyjne

Jak zatrzymać skrypt, a potem wznowić go, gdy Użytkownik naciska klawisz na klawiaturze?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak zatrzymać skrypt, a potem wznowić go, gdy Użytkownik naciska klawisz na klawiaturze?

Cześć Skrypciarze! Chciałbym mieć możliwość zatrzymania skryptu i wznowienia go później, gdy użytkownik naciśnie jakiś klawisz. Jak to zrobić?

AL.

Cześć AL! Rany, to pytanie to powrót do przeszłości. "Naciśnij jakiś klawisz, aby kontynuować", wraz z "Anuluj, Ponów, Zamknij" to chyba najsłynniejsze zwroty w historii komputerów. Wybacz nam na chwilę, przypomniały nam się stare, dobre czasy. Ech...

W dawnych czasach "Naciśnij dowolny klawisz, aby kontynuować" było absolutną podstawą niemal wszystkich plików wsadowych. Wszystko sprowadzało się wtedy do wstawienia komendy pauzy w środek pliku wsadowego; w tym punkcie plik wsadowy zatrzymywał się i jak stare, wierne psisko czekał, aż naciśniesz jakiś klawisz, aby kontynuować. Jak tylko wcisnąłeś klawisz – jakikolwiek klawisz – plik wznawiał pracę. Jeśli ktoś miałby ochotę na mały powrót do przeszłości, może spróbować tego prostego pliku wsadowego i zobaczyć, jak to działało:

echo off

pause

echo The batch file is complete.

Uwaga: pliku nie należy zapisywać z rozszerzeniem .vbs, tylko .bat

Na pewno wielu z Was myśli sobie teraz: „Wow, skrypty są o wiele lepsze od plików wsadowych, założę się, że jest jakiś wypasiony sposób, żeby użyć 'Naciśnij dowolny klawisz' w skrypcie". Prawdę mówiąc, my też tak myśleliśmy. I wiecie co? W skrypcie nie da się tego zrobić.

OK, być może istnieje jakiś dziwaczny sposób, ale mimo długotrwałych poszukiwań nie udało nam się go znaleźć. Kłopot polega na tym, że host skryptów systemu Windows (Windows Script Host - WSH) nie jest środowiskiem sterowanym zdarzeniami; innymi słowy, host skryptów w Windows nie potrafi usiąść i czekać, aż coś (na przykład naciśnięcie dowolnego klawisza) się wydarzy. Dołóżmy do tego ograniczoną zdolność interakcji z wierszem polecenia i w efekcie otrzymujemy środowisko skryptowe, które nie potrafi zreplikować tak użytecznej komendy pauzy.

Wiemy, że niezupełnie takiej odpowiedzi się spodziewałeś. Ale mamy dla Ciebie nagrodę pocieszenia. Nie potrafimy replikować takiej komendy pauzy, podczas której komputer czeka, aż naciśniesz jakiś klawisz. Możemy jednak dać Ci kod, dzięki któremu Twój komputer będzie czekał, aż naciśniesz klawisz ENTER (owszem, to musi być klawisz ENTER). To niedokładnie to, czego chciałeś, ale będzie działać:

strMessage = "Press the ENTER key to continue."

Wscript.StdOut.Write strMessage



Do While Not WScript.StdIn.AtEndOfLine

   Input = WScript.StdIn.Read(1)

Loop

WScript.Echo "The script is complete."

Ten skrypt wyświetla na monitorze wiadomość, a następnie przy użyciu standardowego strumienia wejścia (Standard Input, w skrócie StdIn. Funkcjonuje jedynie w WSH wersji 5.6, co oznacza, że skrypt ten zadziała pod warunkiem, że masz zainstalowany WSH wersji 5.6) czeka, aż użytkownik wprowadzi dane z wiersza polecenia. StdIn grzecznie oczekuje, aż wciśniesz ENTER; skrypt wznawia wówczas działanie. Co się stanie jeśli wciśniesz jakiś inny klawisz? Nic wielkiego: wartość klawisza wyświetli się na ekranie. Skrypt będzie wyświetlał wartości wszystkich naciskanych klawiszy, aż w końcu wciśniesz ENTER. W tym momencie skrypt przerywa pętlę i kontynuuje działanie.

Na wypadek, gdybyś się nad tym zastanawiał, StdIn jest tak naprawdę pomyślany jako możliwość wprowadzania danych do skryptu z poziomu wiersza polecenia. Na przykład, skrypt może podpowiedzieć Ci, żebyś wprowadził nazwę użytkownika lub nazwę pliku. Dlatego właśnie czeka, aż wciśniesz ENTER, jako znak, że wprowadzanie danych zakończyło się. W przeciwnym razie mógłbyś wpisać pierwszą literę nazwy użytkownika i zobaczyć, jak StdIn zaczyna działanie tylko z tą jedną literą. Klawisz ENTER to oficjalny sygnał, że wszystkie niezbędne dane zostały już wprowadzone.

 

 Do początku strony Do początku strony

 

Centrum Skryptów - Systemy Operacyjne