Centrum skryptów - Systemy operacyjne

Jak mogę przekazać zmienne wiersza polecenia do aplikacji HTML w momencie gdy rozpoczyna ona działanie? 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 mogę przekazać zmienne wiersza polecenia do aplikacji HTML w momencie gdy rozpoczyna ona działanie?

Cześć, Skrypciarzu! W jaki sposób można przekazać zmienne wiersza polecenia do aplikacji HTML w momencie gdy rozpoczyna ona działanie?

-- DM

Cześć, DM. Przyznamy się bez bicia: nieźle nas zagiąłeś. (Nie żeby zabicie nam klina było jakimś niesamowitym osiągnięciem.) Nie mieliśmy z początku bladszego pojęcia, czy w ogóle możliwe jest przekazanie zmiennych wiersza polecenia do aplikacji HTML, a jeszcze bledszego, jak wychwycić te zmienne. Potem natknęliśmy się na właściwość commandLine, pokombinowaliśmy jeszcze trochę i mamy odpowiedź.

Uwaga. Aplikacja HTML (nazywana również skrótem HTA) umożliwia wyposażenie skryptu w interfejs graficzny z takimi elementami jak przyciski radiowe, pola wyboru, listy rozwijane i cała reszta. Dodatkowe informacje o aplikacjach HTML znajdują się w naszym nowym centrum programistycznym HTA.

Właściwość commandLine podaje tylko polecenie które uruchomiło aplikację HTML. Aplikacje HTML są narzędziami z interfejsem graficznym, więc zazwyczaj uruchamia się je klikając po prostu dwukrotnie ikonę pliku w Eksploratorze Windows lub Moim komputerze. Dlatego też właściwość ta zazwyczaj jest ścieżką dostępu do pliku aplikacji HTML i wygląda mniej-więcej tak (zwróćcie uwagę że cudzysłów wchodzi w skład wartości tej właściwości):

"C:\Scripts\Cmdline.hta"

Załóżmy że wpiszemy poniższe polecenie w wierszu poleceń:

c:\scripts\cmdline.hta arg1 arg2

Zgadnijcie co w takiej sytuacji poda właściwość commandLine? No właśnie; całe wpisane polecenie, przy czym ścieżka ujęta będzie w cudzysłów, a dwa argumenty zostaną umieszczone na końcu:

"c:\scripts\cmdline.hta" arg1 arg2

Innymi słowy, udało nam się wychwycić argumenty wiersza poleceń; jak widać, arg1 i arg2 są uwzględnione w wartości podanej przez właściwość commandLine. Musimy jeszcze tylko wymyślić sposób, jak je stamtąd wyciągnąć.

Najpierw chcieliśmy usunąć cudzysłów i użyć funkcji Split języka VBScript, by umieścić polecenie w tablicy. Nasz plan zakładał rozdzielenie ciągu znaków na każdej spacji, dzięki czemu uzyskalibyśmy tablicę składającą się z następujących elementów:

c:\scripts\cmdline.hta

arg1

arg2

Plan ten wprawdzie zadziałał, ale pojawił się nieprzewidziany problem. Załóżmy, że w ścieżce aplikacji HTA występuje spacja; na przykład wygląda ona tak: C:\Scripts\My HTAs\Cmdline.hta. Problem w tym, że podział ciągu znaków na każdej spacji dałby tablicę taką jak poniżej:

c:\scripts\cmdline.hta

arg1

arg2

Nie za dobrze. Dlatego wymyśliliśmy nowy trik pozwalający obejść ten problem: należało otoczyć argmenty wiersza poleceń cudzysłowem. Innymi słowy, uruchamiając aplikację HTML należałoby podać takie polecenie:

c:\scripts\my

htas\cmdline.hta

arg1

arg2

Czemu tak? No cóż, dzięki temu uzyskujemy następującą wartość właściwości commandLine:

"c:\scripts\cmdline.hta"  "arg1" "arg2"

Każdy z argumentów jest teraz ujęty w cudzysłów, tak samo jak ścieżka dostępu. Jeśli teraz rozdzielimy ciąg na cudzysłowach (chr(34)), uzyskamy taką tablicę:

<blank line>c:\scripts\cmdline.hta<blank space>arg1<blank space>arg2<blank line>

Innymi słowy, w co drugim wierszu tablicy znajdują się dane, które możemy wykorzystać. Dlaczego pozostałe wiersze są, jak by na to nie patrzeć, puste? Sprawdźcie sami: zamieniając w poniższym wyrażeniu każdy znak " powrotem karetki i przesunięciem o wiersz:

<blank line>

c:\scripts\cmdline.hta

<blank space>

arg1

<blank space>

arg2

<blank line>

No właśnie:

c:\scripts\cmdline.hta

  

arg1

 

arg2

Możecie nam wierzyć lub nie, ale tak jest OK. Mamy już tablicę, więc możemy użyć pętli For Next by przejść przez wszystkie jej elementy. Co więcej, możemy użyć parametru Step, by przejść przez co drugi wiersz. Załóżmy że mamy taką tablicę:

A

B

C

D

Możemy zacząć od drugiego elementu (który ma numer porządkowy 1; pierwszy element ma numer 0) i ustawić wartość parametru Step na 2. W ten sposób odczytany zostanie drugi element (B), a po nim od razu czwarty (D). I o to właśnie nam chodzi w przypadku naszej aplikacji. Zaczniemy pętlę For Next od elementu o numerze 3. Czemu 3? Ponieważ jest to czwarty element tablicy. Pierwsze trzy elementy nas nie interesują: jest to pusty wiersz, ścieżka dostępu do pliku aplikacji, i kolejny pusty wiersz. Czwarty element to pierwszy z naszych argumentów, więc zaczniemy od niego, a potem przeskoczymy do elementu szóstego. (Pamiętamy, że piąty element to pusty wiersz.) W ten to właśnie sposób wychwycimy argumenty wiersza poleceń aplikacji HTML.

Oto kompletny kod aplikacji HTA (należy zapisać go z rozszerzeniem .HTA zamiast .VBS):

<html>

<head>

<title>Command Line Agruments</title>



<HTA:APPLICATION 

     ID="objTestHTA"

     APPLICATIONNAME="Command Line Agruments"

     SINGLEINSTANCE="yes"

>

</head>



<SCRIPT Language="VBScript">



Sub Window_onLoad

    arrCommands = Split(objTestHTA.commandLine, chr(34))

    For i = 3 to (Ubound(arrCommands) - 1) Step 2

        Msgbox arrCommands(i)

    Next

End Sub



</SCRIPT>



<body>

</body>

</html>

Najbardziej interesuje nas procedura Window_onLoad (procedura uruchamiana automatycznie za każdym razem, gdy włączona zostaje aplikacja HTML). W pierwszym wierszu tej procedury wykorzystana jest funkcja Split, która tworzy tablicę na podstawie wartości podanej przez właściwość commandLine, używając cudzysłowu – chr(34) – jako znaku podziału. Następnie uaktywniamy pętlę For Next, poczynając od elementu 3 i przechodząc przez wszystkie elementy tabeli (wartość górnej granicy minus 1). W naszym skrypcie wywoływane jest jedynie echo wartości każdego z argumentów, chociaż kiedy już położy się łapę na tej wartości, można z nią zrobić co tylko się żywnie podoba.

Trzeba jedynie pamiętać, by każdy argument ująć w cudzysłów (jest to i tak konieczne w przypadku argumentów zawierających spacje). Jeśli się o tym nie zapomni, skrypt będzie działał tak jak powinien. Jeśli nie… no cóż, osobom tak szalonym że nie ujmują argumentów wiersza polecenia w cudzysłów możemy tylko obiecać częste odwiedziny w szpitalu.

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne