Centrum Skryptów - Systemy operacyjne

Jak uruchomić podprogram w HTA po upływie jakiegoś określonego czasu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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 uruchomić podprogram w HTA po upływie jakiegoś określonego czasu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam aplikację HTA, która prosi użytkowników, aby kliknęli przycisk w celu zgody na zainstalowanie jakiegoś oprogramowania lub po prostu przycisnęli Cancel, jeżeli tego nie chcą. Czasami jednak użytkownicy nie robią ani tego, ani tego, a HTA czeka w nieskończoność. Czy jest jakiś sposób na to, żeby HTA była widoczna przez jakiś określony czas, a jeżeli użytkownik nie przyciśnie niczego, by dane oprogramowanie instalowało się automatycznie po pływie określonego czasu?

-- TN

Cześć Skrypciarze! Pytanie

Cześć, TN, nie wiem czy zdajesz sobie z tego sprawę, ale to właśnie dziś jest ten długo oczekiwany przez wszystkich dzień. 14 lutego, czy ta data Ci nic nie mówi? Widzisz, mówi, mówi…

Tak, to właśnie dziś jest wigilia naszej Skrypciarskiej Olimpiady Zimowej 2008 Winter Scripting Games (j.ang.), która oficjalnie rusza już 15 lutego. Dlatego prosimy wszystkie rodziny naszych potencjalnych skrypciarzy i skrypciarek o dużą dozę wyrozumiałości i ogłaszamy, że Walentynki, owszem, odbędą się, ale w trochę późniejszym terminie, tuż bo zakończeniu olimpiady. Zdajemy sobie sprawę, że nie jest to święto ruchome, ale Olimpiada Skrypciarska odbywa się przecież jedynie... raz w roku (dobrze, dobrze, wiem, Walentynki też).

Skoro o świętach ruchomych, to zdajemy sobie także sprawę z tego, że skryptoentuzjaści to nie tylko mieszkańcy z okolic Seattle, dochodzą nas bowiem słuchy, że powoli opanowują cały świat. Wszystkim światowcom polecamy zatem artykuł na temat konwertowania czasu pacyficznego na lokalny (zajrzyjcie na tę stronę this Web page (j.ang.) i ten artykuł this column (j.ang.)), Olimpiada rusza bowiem o północy z 14 na 15 lutego (według czasu pacyficznego), a nie chcielibyśmy, żebyście zagubili się w czasoprzestrzeni. Początek planowaliśmy wprawdzie na 8 rano, ale stwierdziliśmy potem, że pójdziemy na rękę mieszkańcom innych stref czasowych.

Jeżeli jednak nie możecie spać z podekscytowania i czekacie na północ, to może poniższy skrypt wciągnie Was na tyle, że nie będziecie musieli spoglądać nerwowo na zegarek.

To naprawdę ekscytujący, choć może trochę niecierpliwy skrypt – patrzy na zegarek tak, jak Wy i czeka, aż ktoś kliknie na jakiś przycisk z aplikacji HTA. Jeżeli nie, to ten ktoś jest sam sobie winny, a skrypt uruchamia podprogram czy tego tak napradę chcemy czy nie:

<SCRIPT Language = "VBScript">

    Dim idTimer



    Sub Window_Onload

        idTimer = window.setTimeout("InstallSoftware", 5000, "VBScript")

    End Sub



    Sub InstallSoftware

        window.clearTimeout(idTimer)

        Msgbox "Installing software ..."

    End Sub



    Sub CancelInstall

        window.clearTimeout(idTimer)

        Msgbox "Installation cancelled."

    End Sub

</SCRIPT>



<BODY>

    <input type="button" value="Install" onClick="InstallSoftware">

    <input type="button" value="Cancel" onClick="CancelInstall">

</BODY>

Czas to pieniądz.

Jak widzicie, powyższa HTA nie należy do najbardziej skomplikowanych. Jej zawartość, czyli <BODY> składa się tylko z dwóch przycisków. Pierwszy - Install, jest skonfigurowany tak, że po kliknięciu na niego uruchamia się podprogram InstallSoftware:

<input type="button" value="Install" onClick="InstallSoftware">

Drugi przycisk - Cancel, jest skonfigurowany tak, że po kliknięciu na niego uruchamia się podprogram CancelInstall:

<input type="button" value="Cancel" onClick="CancelInstall"

Tylko tyle, nie okłamalibyśmy Was przecież. Teraz przyjrzyjmy się bliżej sekcji skryptowej naszej HTA. Mogliście zauważyć, że jeden wiersz kodu nie jest zawarty w podprogramie, a mianowicie:

Dim idTimer

W powyższym wierszu deklarujemy zmienną globalną o nazwie idTimer. Według ustawień domyślnych zmienne używane w HTA są dostępne dla podprogramu tylko w przypadku, gdy te zmienne są zadeklarowane lub użyte. Rzućcie okiem na poniższy podprogram:

Sub VariableTest

    Dim strTest

End Sub

Z uwagi na to, że strTest została zadeklarowana wewnątrz podprogramu VariableTest, jest to jedyne miejsce, w którym może zostać użyta. Nie można pobrać wartości strTest z innego podprogramu. Jedynym przypadkiem, kiedy można uzyskać dostęp do jakiejś zmiennej z innego podprogramu jest użycie zmiennej globalnej. Jak tworzy się zmienne globalne? Bardzo prosto, trzeba tylko umieścić je w sekcji <SCRIPT> naszej HTA (ale nie wewnątrz podprogramu). Róbcie wszystko tak, jak my, pamiętajcie tylko o twierdzeniu Dim.

Po zadeklarowaniu zmiennej globalnej napotykamy na nastepujący podprogram:

Sub Window_Onload

    idTimer = window.setTimeout("InstallSoftware", 5000, "VBScript")

End Sub

Jak zapewne wiecie, w aplikacji HTA każdy podprogram o nazwie Window_Onload uruchamia się automatycznie za każdym razem, gdy HTA jest załadowana lub odświeżana. Co będziemy robić więc przy każdym załadowaniu lub odświeżaniu HTA? Tylko jedną rzecz – skorzystamy z metody setTimeout w celu utworzenia czasomierza idTimer:

idTimer = window.setTimeout("InstallSoftware", 5000, "VBScript")

Czasomierz jest tym, na co wskazuje jego nazwa – jest to formant, który odlicza czas, po upływie którego podejmie jakieś działanie. W celu utworzenia czasomierza wywołujemy metodę setTimeout, nadając jej trzy następujące parametry:

  • InstallSoftware. To nazwa podprogramu, który chcemy uruchomić po upływie danego czasu.
  • 5000. To czas odliczania podany w milisekundach. W każdej sekundzie jest 1000 milisekund, oznacza to zatem, że 5000 milisekund to 5 sekund – właśnie tyle trwa nasz czas oczekiwania przed wywołaniem programu InstallSoftware.
  • VBScript. Ten parametr instruuje HTA w jakim języku został napisany podprogram InstallSoftware.

Po tym wszystkim przy pierwszym ładowaniu naszej HTA, tworzy się czasomierz idTimer, co oznacza dla nas początek odliczania. Po upływie 5 sekund, jeżeli użytkownik niczego nie przycisnął, czasomierz wywoła podprogram InstallSoftware.

Przyjrzyjmy się zatem podprogramowi InstallSoftware:

Sub InstallSoftware

    window.clearTimeout(idTimer)

    Msgbox "Installing software ..."

End Sub

W pierwszym wierszu korzystamy z metody clearTimeout, która anuluje nasz czasomierz idTimer. Czy to ważne? W sumie tak, jeżeli nie anulujemy czasomierza, to będzie on uruchamiał podprogram InstallSoftware co 5 sekund. Chyba nie o to nam chodzi.

Drugi wiersz uruchamia nam okno komunikatu, informujące o tym, że nowe oprogramowanie jest właśnie instalowane. Nie jest ono oczywiście konieczne, a w sumie nawet jest niewskazane, bo spowoduje, że podprogram zatrzyma się, dopóki ktoś nie wyłączy okna. Jest to jednak doskonałe miejsce na umieszczenie kodu instalowania oprogramowania lub czegokolwiek innego, co ma wykonać Wasza HTA.

Podsumowując więc – uruchamiamy HTA, czasomierz zaczyna odliczać czas, a po 5 sekundach odliczania uruchamia się podprogram InstallSoftware. Wszystko to odbywa się automatycznie, bez żadnej interwencji użytkownika. Do czego więc nam te dwa przyciski?

Aby odpowiedzieć na to pytanie chcieliśmy najpierw nadmienić, że czas 5 sekund ustawiliśmy dla celów testowych. W rzeczywistości 5 sekund to najczęściej za mało na podjęcie decyzji na temat dodania cukru do kawy, a co dopiero na podjęcie decyzji dotyczącej zainstalowania jakiegoś oprogramowania. Można więc spokojnie ustawić czasomierz na przykładowe 30 sekund, w taki oto sposób:

idTimer = window.setTimeout("InstallSoftware", 30000, "VBScript")

Teraz podprogram InstallSoftware uruchomi się automatycznie dopiero po upływie 30 sekund. Można także uruchomić go manualnie za pomocą przycisku Install, a instalacja rozpocznie się automatycznie, bez względu na to, ile czasu upłynęło:

Uwaga: Pamiętajcie, że czasomierz nie wstrzymuje całej HTA – nie działa jak polecenie Wscript.Sleep. Czasomierz działa w tle, można więc robić inne rzeczy w naszej HTA, na przykład kliknąć na jeden z przycisków.

OK, przejdźmy do przycisku Cancel. TN chce dać użytkownikom szansę niedopuszczenia do instalacji. W tym celu muszą kliknąć na Cancel, który wywołuje następujący podprogram:

Sub CancelInstall

    window.clearTimeout(idTimer)

    Msgbox "Installation cancelled."

End Sub

Zwróćcie uwagę na ten podprogram. Korzystamy tu z metody clearTimeout w celu pozbycia się czasomierza. Po wykonaniu tego generuje się okno komunikatu informujące użytkownika o tym, że proces został anulowany. Tego kodu używamy jednak także dla celów demonstracyjnych. Można wstawić tutaj jakikolwiek kod, dla przykładu taki:

window.close()

Spowoduje on, że HTA zostanie zamknięta za każdy razem, gdy użytkownik naciśnie na przycisk Cancel. Można także ustawić HTA na ekranie. Dzięki temu użytkownik będzie mógł zainstalować oprogramowanie za pomocą przycisku Install. To już zależy od Was.

Mamy nadzieję, że artykuł jest wystarczająco wyczerpujący i spełnił Twoje oczekiwania, TN! Tak czy owak, życzymy Wam udanej Wigilii Skrypciarskich Zmagań! Mamy nadzieję, że zobaczymy się jutro na ceremonii otwarcia Opening Day (j.ang.) (jeżeli nie wspomnieliśmy tego wystarczając wiele razy to przypominamy, że to 15 lutego). Gorąco zachęcamy do zmagań, są ciekawe, kształcące, a ponadto można wygrać naprawdę super nagrody (great prizes (j.ang.)).

Aha, i żeby nie było, pamiętamy także o Walentynkach. Udanych Walentynek zatem! Nie wiem czy wiecie, ale w Japonii w Walentynki to kobiety kupują czekoladki mężczyznom i to wszystkim mężczyznom, z którymi pracują. Ciekawe czy Skrypciarka Jean Ross jest tego świadoma…

Od Redakcji: Jean Ross jest tego absolutnie świadoma, dlatego też z utęsknieniem czeka na jakiś zegarek lub pierścionek 14 marca, w japoński „Biały Dzień”, czyli święto, w którym to mężczyźni obdarowują podarkami wszystkie współpracownice.

 Do początku strony Do początku strony

Centrum Skryptów - Systemy operacyjne