Centrum skryptów - Systemy operacyjne

Jak utworzyć aplikację HTA wyświetlającą pliki dziennika?

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 utworzyć aplikację HTA wyświetlającą pliki dziennika?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam kilka plików dziennika (wszystkie znajdują się w tym samym folderze), które muszę okresowo przeglądać. W marzeniach widzę aplikację HTA, która po uruchomieniu pobiera wszystkie nazwy plików dziennika i wyświetla je w polu listy; potem mogę kliknąć dowolną nazwę, a aplikacja HTA odczyta plik i wyświetli jego zawartość w polu tekstowym. Nie mam jednak pojęcia, jak coś takiego zrobić. Możecie mi pomóc?

-- JJ

Cześć Skrypciarze! Pytanie

Cześć, JJ. Ostatnimi czasy sporo się mówi na temat tego, że ludzie czytają o wiele mniej niż dawniej. Przykładowo w 1950 roku przeciętne gospodarstwo domowe w Stanach Zjednoczonych kupowało – i czytało – 1,23 gazet dziennie. (Innymi słowy ludzie prenumerowali więcej niż jedną gazetę.) Dzisiaj ta liczba spadła do 0,44, co oznacza, że większość ludzi nie prenumeruje żadnej gazety. Czasopisma doświadczyły niewielkiego spadku, a jeżeli chodzi o książki, to tylko połowa Amerykanów przeczytała choć jedną książkę w ciągu całego roku. Przecież to zatrważające!

Według ekspertów od środków masowego przekazu, obecnie na świecie jest tylko jedna rzecz, którą musi przeczytać absolutnie każdy i to za każdym razem, kiedy się pojawia: oficjalny program zimowej Olimpiady Skrypciarskiej.

Uwaga. OK, może i dwie rzeczy, ale jakoś nie jestem przekonany, że ktoś ogóle czyta „Poradnik językowy”.

Statystycznie rzecz ujmując, możliwe jest, że niektórzy z Was należą do tego szerokiego grona osób czytających tylko jedną rzecz w roku – program Olimpiady Skrypciarskiej. (Chociaż, jeżeli to jedyna rzecz, jaką czytacie, to chyba nie czytacie dzisiejszej rubryki, nieprawdaż?). Tak czy inaczej, mam dla Was dobre wieści: program zimowej Olimpiady Skrypciarskiej 2008 został już wydany i jest dostępny do pobrania.

Czy konieczne jest pobranie kopii programu, aby wziąć udział w Olimpiadzie? Oczywiście, że nie. Jak moglibyśmy Wam coś takiego zrobić? (W sumie moglibyśmy, ale skoro nie ma żadnej opłaty, to po co?). Tak czy siak, informacje znajdujące się w programie mogą być bardzo pomocne zwłaszcza dla nowicjuszy; polecam część z pytaniami i odpowiedziami, która opisuje, czego można się spodziewać po rozpoczęciu Olimpiady w dniu 15 lutego. Ponadto, program zawiera kompletny plan wydarzeń (w tym wszystkie terminy); przegląd niektórych nowych funkcji oraz opis konkurencji zarówno dla początkujących, jak i zaawansowanych uczestników. Znajdują się tam praktycznie wszystkie informacje na temat Olimpiady 2008.

Chcę jeszcze dodać, że pobranie programu to świetny sposób pokazania naszym sponsorom, że coś się dzieje. W tym roku mamy absolutnie niezwykłe nagrody ofiarowane przez firmy takie, jak Sapien Technologies, Special Operations Software oraz Shell Tools. Pokażmy im, jak doceniamy ich szczodrość.

Dla osób, które czytają trochę więcej, a mianowicie dwie rzeczy w roku, mam skrypt tworzący aplikację HTA pobierającą listę wszystkich plików znajdujących się w folderze i wyświetlającą zawartość określonego pliku w polu tekstowym aplikacji HTA po kliknięciu na dany plik.

Taką aplikację tworzymy w ten oto sposób:

<SCRIPT Language="VBScript">

    Sub Window_Onload

        strComputer = "."



        Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



        Set colFiles = objWMIService.ExecQuery _

            ("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _

                & "ResultClass = CIM_DataFile")



        For Each objFile In colFiles

            Set objOption = Document.createElement("OPTION")

            objOption.Text = objFile.FileName

            objOption.Value = objFile.Name

            LogFiles.Add(objOption)

        Next

    End Sub



    Sub ReadFile

        Set objFSO = CreateObject("Scripting.FileSystemObject")

        Set objFile = objFSO.OpenTextFile(LogFiles.Value)



        strContents = objFile.ReadAll



        objFile.Close



        LogContents.Value = strContents

    End Sub

</SCRIPT>



<body>

    <table width="100%">

        <tr>

            <td width="25%" valign="top">

               <select size="35" name="LogFiles" onChange="ReadFile" style="width:150px"></select>

            </td>

            <td width="75%" valign="top">

                <textarea name="LogContents" rows="35" cols="100"></textarea>

            </td>

        </tr>

    </table>

</body>

Na początek przyjrzyjmy się kodowi aplikacji HTA. Jak widzimy, składa się on z jednowierszowej tabeli zawierającej dwie kolumny. Dlaczego używamy tutaj tabeli? Z jednego tylko powodu: upraszcza nam to umieszczenie obok siebie pola listy i pola tekstowego (lub, dokładniej mówiąc, obszaru tekstu). Umieszczamy pole listy w kolumnie pierwszej tabeli, używając poniższego tagowania HTML w celu zdefiniowania pola listy:

<select size="35" name="LogFiles" onChange="ReadFile" style="width:150px"></select>

Jak widać, jest to proste pole listy mieszczące 35 elementów (czyli naraz na ekranie pojawiać się będzie 35 elementów) oraz nazwę LogFiles. Dodaliśmy ponadto dwa dodatkowe parametry do pola listy: onChange="ReadFile" informujący aplikację HTA, że powinna uruchomić podprocedurę ReadFile po każdej zmianie wartości w polu listy; oraz style="width:150px" ustawiający szerokość naszego pola listy na 150 pikseli.

Jak już mówiłem, całkiem proste pole listy. Tak proste, że nie zdefiniowaliśmy dla niego żadnych opcji. Ale nie martwcie się; zajmiemy się tym za kilka minut.

Zanim to jednak nastąpi, musimy zastosować poniższy wiersz kodu w celu dodania obszaru tekstu do aplikacji HTA:

<textarea name="LogContents" rows="35" cols="100"></textarea>

Nie ma w tym nic skomplikowanego. Mamy obszar tekstu o nazwie LogContents, w którym wyświetlone zostanie 35 rzędów i 100 kolumn. (W aplikacji HTML „kolumna” w obszarze tekstu jest mniej więcej równa jednemu znakowi. W ten sposób wyświetlamy około 100 znaków w każdym wierszu w polu tekstowym.) To nam załatwia sprawę aplikacji HTA. Zajmijmy się teraz dwiema podprocedurami: Window_OnLoad oraz ReadFile.

Jak zapewne wiecie, w aplikacji HTA podprocedura o nazwie Window_OnLoad uruchamia się automatycznie po każdym uruchomieniu lub odświeżeniu aplikacji HTA. Co chcemy uzyskać po każdym uruchomieniu lub odświeżeniu aplikacji HTA? Cóż, na początek chcemy, żeby aplikacja HTA połączyła się z usługą WMI na lokalnym komputerze, a następnie wykonujemy poniższy fragment kodu w celu pobrania kolekcji wszystkich plików znajdujących się w folderze C:\Scripts:

Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _

        & "ResultClass = CIM_DataFile")

Teraz dodamy kilka opcji do naszego pola listy, dokładniej mówiąc, dodamy pliki znajdujące się w folderze C:\Scripts do pola listy. W tym celu najpierw uruchamiamy pętlę For Each, która przejdzie przez naszą kolekcję plików:

For Each objFile In colFiles

Wewnątrz pętli wykonujemy poniższy wiersz kodu w celu utworzenia „pustej” opcji dla pola listy:

Set objOption = Document.createElement("OPTION")

Następnie przypisujemy wartości do dwóch właściwości naszej nowej opcji: ustawiamy wartość właściwości Text jako nazwę pierwszego pliku w kolekcji (w języku usługi WMI jest to właściwość FileName) oraz ustawiamy właściwość Value opcji jako ścieżkę pliku (w usłudze WMI – właściwość Name). Oznacza to, że w polu listy pojawi się tylko nazwa pliku (np. IIS Log). Jeżeli jednak użytkownik kliknie pole, pobrana zostanie kompletna ścieżka pliku, co uprości nam zlokalizowanie i otwarcie pliku.

Teraz wystarczy wywołać metodę Add w celu dodania tej nowej opcji do pola listy LogFiles:

LogFiles.Add(objOption)

Następnie wracamy na początek pętli, gdzie powtarzamy proces dla następnego pliku w kolekcji. Po zakończeniu, nazwa każdego pliku znajdującego się w folderze C:\Scripts pojawi się jako opcja w polu listy LogFiles.

A co z podprocedurą ReadFile? Cóż, jak zauważyłem wcześniej, za każdym razem, gdy użytkownik wybierze element z pola listy, wywołana zostanie podprocedura ReadFile. Kiedy tak się stanie, utworzymy wystąpienie obiektu Scripting.FileSystemObject, a następnie wykonamy poniższy wiersz kodu w celu otwarcia wybranego pliku tekstowego:

Set objFile = objFSO.OpenTextFile(LogFiles.Value)

Po otwarciu pliku używamy metody ReadAll w celu wczytania całej zawartości pliku do zmiennej o nazwie strContents i zamykamy plik. Co robimy ze zmienną strContents? Przypisujemy tę wartość do właściwości Value naszego obszaru tekstu:

LogContents.Value = strContents

Jak mogliśmy się spodziewać, spowoduje to, że w magiczny sposób zawartość wybranego pliku tekstowego pojawi się w obszarze tekstu. Może to wyglądać mniej więcej tak:

Kliknięcie innego pliku w polu listy spowoduje wyświetlenie zawartości tego pliku tekstowego w obszarze tekstu. Fajna zabawa i o wiele szybsza niż ręczne otwieranie wszystkich plików po kolei.

To powinno wystarczyć, JJ. Pamiętaj, że to działa tylko w przypadku plików tekstowych. Arkusz kalkulacyjny programu Excel, ani slajd prezentacji programu PowerPoint nie zostanie wyświetlony w HTA. (To też może być fajna zabawa, ale na pewno nie zadziała.). Ale to w końcu żaden problem; w dzisiejszych czasach i tak nikt by tego nie przeczytał.

Zwłaszcza teraz, kiedy program Olimpiady Skrypciarskiej został opublikowany.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne