Centrum skryptów - Systemy operacyjne

Jak sprawdzić, czy użytkownik wprowadził prawidłową literę dysku?

Udostępnij na: Facebook

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 sprawdzić, czy użytkownik wprowadził prawidłową literę dysku?

Cześć, Skrypciarze! Jak upewnić się, że dane wprowadzone do pola InputBox mają formę X:, przy czym X to znak alfabetyczny? To ważne, ponieważ muszę zastosować ten ciąg do zmapowania logicznych dysków w skrypcie. Skrypt powinien zatwierdzić każdy ciąg, taki jak D:, E: lub F:, ale oznaczyć jako nieprawidłowe ciągi typu 9:, !:, 22: itd. Mam ograniczone doświadczenie z wyrażeniami regularnymi i nie mogę znaleźć właściwego wzorca.

-- DL

Cześć, DL. Jeżeli chcecie znać prawdę, są takie dni, kiedy w ogóle nie mam ochoty pisać artykułu do rubryki Cześć Skrypciarze!. (Zszokowani? Niepotrzebnie; Skrypciarze skrywają przeróżne myśli tego typu). Jednak dzisiejszy dzień nie jest takim dniem. Wręcz przeciwnie, dziś jestem bardzo zadowolony z tego, że mogę spędzić trochę czasu pisząc na temat zatwierdzania danych wprowadzonych do pola InputBox. Wszystko dlatego, że alternatywą dla mnie byłaby gra w Blackjacka. Po zagraniu ponad 200 partii tej gry potrzebuję dłuższej przerwy.

Ktoś mógłby zacząć się zastanawiać „Dlaczego on gra w Blackjacka? Czy Skrypciarze prowadzą jakiś nielegalny dom gier w Centrum Skryptów?” Może i tak jest, ale ja nic o tym nie wiem.

Moja gra w Blackjacka miała związek z tym, że muszę ocenić konkurencję 10 Zimowej Olimpiady Skrypciarskiej 2008 (część dla zaawansowanych), w której uczestnicy mieli za zadanie napisać skrypt rozgrywający partyjkę Blackjacka.

W każdym razie mam dobrą wiadomość dla osób niecierpliwie czekających na wyniki Olimpiady. Pomału zmierzamy ku końcowi i już niedługo wszystkie wyniki będą dostępne. Ponieważ idzie nam tak dobrze, mam dużo czasu na pokazanie Wam skryptu, który sprawdza, czy w polu wejściowym została wprowadzona poprawna litera dysku:

Set objRegEx = CreateObject("VBScript.RegExp")



objRegEx.Global = True   

objRegEx.Pattern = "[d-zD-Z]:"



Do While True

    strSearchString = InputBox("Please enter the drive letter:", "Drive Letter")



    If strSearchString = "" Then

        Wscript.Quit

    End If



    If Len(strSearchString) = 2 Then

        Set colMatches = objRegEx.Execute(strSearchString)  



        If colMatches.Count > 0 Then

            Exit Do

        End If

    End If

Loop



Wscript.Echo "Your drive letter is " & strSearchString & "."

Zobaczmy, co się tutaj dzieje. (Jak widzimy, skrypt rozpoczyna się od utworzenia wystąpienia obiektu VBScript.RegExp, który umożliwia nam wykorzystanie wyrażeń regularnych w skrypcie VBScript. Po utworzeniu wystąpienia obiektu RegExp przypisujemy wartości do dwóch właściwości tego obiektu. Na początek ustawiamy właściwość Global jako True; dzięki temu skrypt wyszuka wszystkie wystąpienia tekstu docelowego. W tym przypadku właściwość Global nie ma dla nas znaczenia; i tak znajdziemy najwyżej jedno dopasowanie (czyli literę dysku). Ogólnie rzecz biorąc, ustawienie właściwości Global jako True to dobre rozwiązanie; zazwyczaj chcemy znaleźć wszystkie wystąpienia czegoś, nie tylko pierwsze.

Następna właściwość, Pattern, jest trochę bardziej interesująca. (Chociaż wcale nie powiedziałem, że właściwość Global nie jest interesująca. Nie mógłbym czegoś takiego powiedzieć!) Właściwość Pattern służy do określania tekstu, który chcemy znaleźć. A jaki tekst chcemy znaleźć? Taki:

"[d-zD-Z]:"

Nie będę się dzisiaj zagłębiał w szczegóły dotyczące składni wyrażeń regularnych; wprowadzenie do wyrażeń regularnych znajduje się w naszym artykule z Magazynu TechNet (j.ang.). W skrócie, to wyrażenie regularne może zostać zinterpretowane w poniższy sposób: Po pierwsze, należy znaleźć wszystkie znaki określone w nawiasach kwadratowych ([ ]). Nawiasy kwadratowe umożliwiają określenie zbioru znaków; jeżeli znajdziemy jeden z tych znaków, mamy dopasowanie.

Jakich znaków szukamy? Cóż, może to być dowolny znak z zakresu d-z; czyli zakresu obejmującego wszystkie małe litery od d do z. Alternatywnie może to być także dowolny znak z zakresu D-Z; czyli zakresu obejmującego wszystkie wielkie litery od D do Z. Litery P, Q, R, s, t będą stanowiły dopasowania; litery A, B oraz c nie.

Uwaga. Dlaczego zakres od D do Z (lub od d do z)? To proste: nie można mapować dysków, używając liter A, B lub C (lub ich ekwiwalentów małymi literami).

Innymi słowy, pierwszy znak misi być literą (małą lub dużą) z zakresu od D do Z. Po tej literze musi następować dwukropek (do tego służy :) Zgodnie z życzeniem DL, wartości D:, E: oraz F: zostaną uznane za poprawne, a wartości 9:, !: oraz 22: za niepoprawne.

Po zdefiniowaniu wzorca wyrażenia regularnego uruchamiamy pętlę Do, która będzie działać bez końca. (Lub przynajmniej dopóki wartość True się nie zmieni.) Wewnątrz tej pętli najpierw używamy poniższego wiersza kodu w celu wyświetlenia pola wejściowego, w którym użytkownik ma wprowadzić literę dysku:

strSearchString = InputBox("Please enter the drive letter:", "Drive Letter")

Pole wejściowe pozostanie widoczne na ekranie do momentu kliknięcia przez użytkownika przycisku OK lub Cancel. Jeżeli użytkownik kliknie przycisk OK, wartość wpisana w polu zostanie zachowana w zmiennej o nazwie strSearchString. Jeżeli użytkownik kliknie przycisk Cancel, zmienna strSearchString otrzyma wartość pustego ciągu.

Załóżmy, że użytkownik kliknie przycisk Cancel. W takim przypadku zakładamy, że wcale nie chce zmapować dysku. Mając to na uwadze, używamy poniższego fragmentu kodu w celu sprawdzenia, czy zmienna strSearchString ma wartość pustego ciągu. Jeżeli tak jest, wywołujemy metodę Wscript.Quit w celu zakończenia działania skryptu:

If strSearchString = "" Then

    Wscript.Quit

End If

Jeżeli zmienna strSearchString nie jest pusta, musimy upewnić się, że w ciągu znajdują się tylko dwa znaki (nie można zmapować dysku używając ciągu ABCDE:). Mogliśmy utworzyć bardziej skomplikowane wyrażenie regularne sprawdzające długość ciągu, ale pomyślałem sobie, że prościej będzie użyć w do tego celu funkcji Len skryptu VBScript.

If Len(strSearchString) = 2 Then

Jeżeli długość ciągu (liczba znaków) jest większa niż 2, kontynuujemy działanie pętli, wyświetlamy kolejne pole wejściowe i monit dla użytkownika o ponowne spróbowanie. Jednak jeżeli długość ciągu to 2, używamy poniższego wiersza kodu w celu wykonania wyszukiwania z pomocą naszego wyrażenia regularnego:

Set colMatches = objRegEx.Execute(strSearchString)

Jeżeli znajdziemy jakieś wystąpienia tekstu docelowego (czyli jednej z liter z zakresu od D do Z z następującym po niej dwukropkiem), zostaną ona zachowane w kolekcji o nazwie colMatches. Skąd mamy wiedzieć, że znalezione zostały jakieś dopasowania? To proste: sprawdzamy właściwość Count, która informuje nas o liczbie elementów znajdujących się w kolekcji:

If colMatches.Count > 0 Then

Jeżeli właściwość Count ma wartość większą niż 0, oznacza to, że mamy prawidłową literę dysku. W takim wypadku wywołujemy instrukcję Exit Do i kończymy działanie pętli Do. Następnie wywołujemy echo litery dysku:

Wscript.Echo "Your drive letter is " & strSearchString & "."

Jeżeli właściwość Count ma wartość 0, oznacza to, że wprowadzona „litera dysku" jest niepoprawna; Użytkownik mógł na przykład wprowadzić wartość $:. Jeżeli tak się stało, wracamy na początek pętli, wyświetlamy kolejne pole wejściowe i próbujemy jeszcze raz.

Możecie wierzyć lub nie, ale to już wszystko.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne