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