Centrum Skryptów - Systemy operacyjne

W jaki sposób uzyskać dostęp do biblioteki typów z poziomu skryptu? 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.

W jaki sposób uzyskać dostęp do biblioteki typów z poziomu skryptu?

Cześć Skrypciarzu! W jaki sposób uzyskać dostęp do biblioteki typów z poziomu skryptu?

-- XA

Cześć XA! Tym, którzy nie spotkali się jeszcze z tym terminem, wyjaśniamy: biblioteka typów jest plikiem lub składnikiem, który zawiera informację o typie obiektu COM; informacja ta opisuje obiekt i działania, które można przy jego pomocy przeprowadzić. W bibliotece znajdują się między innymi informacje o używanych przez obiekt stałych. Na przykład, FileSystemObject zawiera te trzy stałe oraz ich wartości:

ForReading (1)

ForWriting (2)

ForAppending (8)

Ktoś mógłby zapytać: i co z tego? No cóż, za każdym razem kiedy uzyskujecie dostęp do pliku tekstowego przy pomocy FileSystemObject, musicie odwołać się do jednej z tych stałych. Załóżmy na przykład, że chcecie otworzyć plik C:\Scripts\Test.doc i zapisać w nim bieżącą datę i godzinę. Będziecie do tego potrzebowali takiego skryptu:

Const ForWriting = 2



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile _

    ("c:\scripts\test.txt", ForWriting)



objTextFile.WriteLine Now

objTextFile.Close

Zwróćcie uwagę na dwie rzeczy. Po pierwsze, otwierając plik (przy pomocy metody OpenTextFile), dołączamy stałą ForWriting (do zapisu), ponieważ obiekt FileSystemObject wymaga określenia, czy plik jest otwierany do odczytu, do zapisu, czy też w trybie dołączania. Po drugie, zauważcie, że – w pierwszej linii skryptu – wyraźnie przypisaliśmy stałej ForWriting wartość 2. To dlatego, że VBScript nie ma dostępu do bibliotek typów. W związku z tym musieliśmy określić w skrypcie, że wartość ForWriting wynosi 2.

Języki programowania (na przykład Visual Basic) mogą się z kolei bezpośrednio połączyć się z bibliotekami typów. Pisząc program w Visual Basic, nie musielibyśmy definiować stałej ForWriting i przypisywać jej wartości 2. Zamiast tego moglibyśmy po prostu użyć stałej w kodzie, a Visual Basic podłączyłby się do biblioteki typów i znalazł ją.

Innymi słowy, języki programowania mają dostęp do bibliotek typów, dzięki czemu nie trzeba definiować żadnej ze stałych znajdujących się w tych bibliotekach. VBScript niestety nie ma dostępu do bibliotek typów, co powoduje, że trzeba ręcznie zdefiniować wszystkie stałe, które zostaną użyte w skrypcie. (Czasami – zwłaszcza gdy przy pomocy obiektów ADO pisze się skrypt, który ma współdziałać z bazami danych – trzeba użyć dziesiątek stałych, z których każdą trzeba zdefiniować oddzielnie).

Wiemy: siedzicie tam i myślicie sobie: "No już, powiedzcie nam jak to obejść, wiemy, że to wiecie." Racja, wiemy jak to obejść. Mniej-więcej. Jeśli piszecie "tradycyjny" skrypt VBScript (czyli z rozszerzeniem .vbs), to przykro nam, ale macie pecha. Jeśli jednak zamierzacie napisać Windows Script File (plik skryptu Windows – rozszerzenie .wsf), to co innego.

Pliki WSF zadebiutowały w WSH 5.6. Szczerze mówiąc, nie wywarły od tamtej pory większego wpływu na środowisko skrypciarskie. (Po szczegóły odsyłamy do dokumentacji WSF (j.ang.) na stronach MSDN). Kłopot z plikami WSF polega na tym, że wszystkie ich zalety (jak dostęp do bibliotek typów) nikną wobec ich zasadniczej wady, czyli konieczności obudowywania skryptu mnóstwem znaczników XML. Jeśli jednak XML Wam niestraszny i jeśli naprawdę chcecie mieć dostęp do bibliotek typów, użyjcie takiego kodu (pamiętajcie o tym, żeby zapisać go z rozszerzeniem .wsf, a nie .vbs):

package>

    <job id="Test">

        <object id="objFSO" progid="Scripting.FileSystemObject"/>

         <reference object="Scripting.FileSystemObject" />

            <script language="VBScript">

                Set objTextFile = objFSO.OpenTextFile _

                    ("c:\scripts\test.txt", ForWriting)

                objTextFile.WriteLine Now

                objTextFile.Close   

            </script>

    </job>

</package>

Oczywiście, że to dziwnie wygląda. To dlatego tak niewielu ludzi używa plików WSF. Jeśli przyjrzysz się znacznikowi <script>, zauważysz, że to ten sam skrypt, którego użyliśmy wcześniej. Z dwoma wyjątkami: nie ma kodu tworzącego FileSystemObject, jak również kodu definiującego stałą ForWriting. Zamiast tego użyliśmy odpowiednio znaczników <object> i <reference>.

W skrypcie VBScript, aby utworzyć wystąpienie FileSystemObject, użyliśmy tego kodu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

W pliku WSF w tym samym celu użyjemy znacznika <object>:

<object id="objFSO" progid="Scripting.FileSystemObject"/>

Zwróćcie uwagę na ID przypisane do obiektu: objFSO, dokładnie to samo odniesienie do obiektu, którego użyliśmy w pliku .vbs.

Kiedy już utworzymy odniesienie do obiektu, możemy uzyskać dostęp do biblioteki typów (i wszystkich zdefiniowanych w jej ramach stałych) przy pomocy znacznika <reference>:

<reference object="Scripting.FileSystemObject" />

To już wszystko. Możemy teraz odnieść się do dowolnej stałej znajdującej się w FileSystemObject, bez potrzeby definiowania tej stałej. Fajnie, no nie? Rzecz jasna, nie zawsze jest tak łatwo. Czasem, podczas tworzenia obiektu i odniesienia, będziecie musieli użyć GUID zamiast ProgId (jak na przykład "cripting.FileSystemObject"). Od czegoś jednak trzeba zacząć.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy operacyjne