Centrum skryptów - Systemy operacyjne

Jak wywołać monit do użytkownika o podanie informacji, a następnie przekazać te informacje do narzędzia wiersza poleceń?

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 wywołać monit do użytkownika o podanie informacji, a następnie przekazać te informacje do narzędzia wiersza poleceń?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak wywołać monit do użytkownika o podanie informacji, a następnie przekazać te informacje do narzędzia wiersza poleceń?

-- SD

Cześć Skrypciarze! Odpowiedź

Cześć, SD. efh;r9d/fjwf

Przepraszam, spróbujmy jeszcze raz. j ewewrj 2gr CX # 2kkkkw

Skrypciarz piszący te słowa ma pewien problem z precyzją ruchów rąk. To wszystko dlatego, że wczoraj, zamiast pojeździć przez pół godziny na ćwiczebnym rowerze w siłowni, postanowił pójść na basen i forsownie trenować pływanie kraulem. Nie trzeba chyba mówić, że nie powstrzymało go to przed napisaniem dzisiejszego artykułu. To znaczy, powstrzymałoby, gdyby miał wybór. Ale nie miał:

Set objShell = CreateObject("Wscript.Shell")



strName = InputBox("Please enter the user name:")



If strName = "" Then

    Wscript.Quit

End If



strCommand = "%comspec% /k dsquery user -name " & Chr(34) & strName & chr(34)

strCommand = strCommand & " | dsget user -tel"



objShell.Run strCommand

Z Twojego e-maila, SD, wynika, że zależy Ci tak naprawdę na wyświetleniu monitu o podanie nazwy użytkownika, znalezieniu tego użytkownika w Active Directory (używając komend wiersza poleceń Dsquery i Dsget) i wyświetleniu jego lub jej numeru telefonu. Aby wszyscy wiedzieli o co chodzi, przytaczamy przykładowe polecenie, przesłane nam przez SD. Zmienna x oznacza nazwę użytkownika:

dsquery user –name x | dsget user –tel

Wyjaśnijmy, jak działa nasz skrypt. Jak widać, najpierw tworzymy w nim wystąpienie obiektu Wscript.Shell; użyjemy go, kiedy przyjdzie czas na wywołanie narzędzi wiersza poleceń. Tymczasem jednam wywołujemy okienko InputBox, prosimy o wpisanie nazwy użytkownika i zapisujemy ją w zmiennej strName:

strName = InputBox("Please enter the user name:")

Kolejny krok jest właściwie opcjonalny, ale jego wykonanie wygląda na niegłupi pomysł. Wpisanie nazwy użytkownika do okienka InputBox i kliknięcie OK (lub naciśnięcie klawisza ENTER) spowoduje jej zapisanie w zmiennej strName. Co jednak, jeśli użytkownik kliknie przycisk Anuluj? Otóż w takim wypadku w zmiennej strName zapisany zostanie pusty ciąg znaków („”). Poza tym, kliknięcie przycisku Cancel oznacza najprawdopodobniej, że użytkownik chce przerwać działanie skryptu. (Nie da się ukryć, że Skrypciarze są strasznie sprytni!) Dlatego też dodaliśmy fragment kodu, który sprawdza, czy wartość strName zawiera pusty ciąg. Jeśli tak, to wywołujemy metodę Quit, która zamyka skrypt:

If strName = "" Then

    Wscript.Quit

End If

Chyba poprosimy Billa o podwyżkę.

Możemy teraz napisać komendę wiersza poleceń (zwróćmy uwagę, że przeważnie najlepiej jest najpierw napisać komendę, zapisać ją w zmiennej i dopiero wtedy uruchomić). Nie jest to szczególnie trudne, ale trzeba uważać na parę rzeczy:

Samo uruchomienie obu narzędzi wiersza poleceń nie wystarczy, ponieważ wynik zostanie wyświetlony zbyt szybko, by dało się go przeczytać. Zamiast tego musimy otworzyć nowe okno poleceń, uruchomić narzędzia, a następnie upewnić się, że okno poleceń nie zamknie się po zakończeniu ich działania. W naszym przykładzie załatwia to fragment %comspec% /k (%comspec% otwiera okno, a /k sprawia, że się ono nie zamknie).
W komendzie musimy wpisać cudzysłowy. Może to być pewien problem w wypadku zmiennej składającej się z ciągu znaków, ale pokażemy, jak się tym zająć w możliwie mało problematyczny sposób.

Aby łatwiej było to wyjaśnić, podzieliliśmy procedurę na dwa kroki. Oto pierwszy z nich:

strCommand = "%comspec% /k dsquery user -name " & Chr(34) & strName & chr(34)

O co tu chodzi? Otóż najpierw otwieramy nowe okno i upewniamy się, że po zakończeniu działania komend Dsquery i Dsget okno pozostanie otwarte; do tego właśnie służy fragment %comspec% /k. Następnie używamy podstawowej komendy Dsquery, czyli dsquery user –name. Teraz dochodzimy do trudniejszej części – podania nazwy użytkownika ujętej w cudzysłów.

Chociaż z drugiej strony, jeśli spojrzeć na skrypt, to wcale nie wydaje się on taki trudny. Zwróćmy uwagę, że w komendzie Dsquery, za paramterem –name, znajduje się puste miejsce – umożliwia to wpisanie nazwy użytkownika. Użyjemy do tego stosunkowo prostej składni: Chr(34) & strName & Chr(34).

Co to oznacza? Zacznijmy od tego, że wartość funkcji Chr wyrażona jest w formacie ASCII. Liczba 34 w tym formacie oznacza właśnie cudzysłów.

Teraz wstawiamy zmienna strName i drugi cudzysłów. Jeśli np. wpisaliśmy nazwę użytkownika Ken Myer, zmienna strCommand będzie wyglądać tak:

%comspec% /k dsquery user –name "Ken Myer"

Chyba nieźle, prawda?

Teraz przechodzimy do drugiego kroku, używając poniższego wiersza kodu:

strCommand = strCommand & " | dsget user -tel"

Modyfikujemy tu zmienną strCommand – będzie ona równa dotychczasowej wartości plus: | dsget user –tel. Ostatecznie zmienna strCommand będzie wyglądać tak:

%comspec% /k dsquery user –name "Ken Myer" | dsget user -tel

I to właśnie jest komenda potrzebna, by za pomocą Dsquery i Dsget pobrać numer telefonu Kena Myera.

Teraz wystarczy już tylko wywołać metodę Run:

objShell.Run strCommand

Zwróćmy uwagę, że skrypt po prostu wywoła komendy Dsquery i Dsget, po czym wyświetli numer telefonu Kena Myera w oknie poleceń. Czy można pobrać ten numer i wykorzystać go w innym miejscu skryptu? Owszem, można, lecz wymaga to dodatkowego kodowania oraz użycia metody Exec zamiast Run. Dodatkowe informacje można znaleźć w artykule z serii Tales from the Script: Uruchamianie programów ze skryptów WSH (j.ang.), który, nawiasem mówiąc, jest pierwszym artykułem opublikowanym w amerykańskim Centrum Skryptów.

Jeśli zaś chodzi o Skrypciarza piszącego te słowa, to na pożegnanie jest w stanie napisać tylko tyle: dsfhg3e^t r4.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne