Centrum Skryptów - Systemy Operacyjne

W jaki sposób można przerwać pętlę For Each? 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 można przerwać pętlę For Each?

Cześć, Skrypciarzu! Czy istnieje jakiś sposób, by przerwać działanie pętli w skrypcie?

-- Michał

Cześć, Michale. Prawdę mówiąc, kiedy zaczęliśmy pisać artykuły z tej serii, chcieliśmy by były one proste i odpowiadały na podstawowe pytania początkujących skrypciarzy:

  • W jaki sposób można określić bieżącą datę w skrypcie? (Użyj funkcji Date języka VBScript.)
  • Jak mogę wywołać echo wiadomości w oknie poleceń zamiast w polu komunikatu? (Uruchom skrypt używając hasła CScript.)
  • Jak mogę określić czy zmienna ma wartość numeryczną? (Użyj funkcji IsNumeric.)

No ale wiecie jak to bywa: wkrótce coraz to więcej ludzi pisało do nas, jak fajne są nasze artykuły, i zaczęliśmy odpowiadać na pytania dzięki którym mogliśmy się popisać swoimi zdolnościami. Wreszcie staliśmy się tak zarozumiali, że w ogóle przestaliśmy odpowiadać na pytania w rodzaju „Jak wyświetlić okno dialogowe w które można wpisywać informacje?” (używając funkcji InputBox języka VBScript) i poszliśmy raczej w kierunku: „Jak za pomocą skryptu wypędzić ducha Grety Garbo z nawiedzonego?” Temat z gatunku ciekawszych, ale niekoniecznie leżący w zasięgu początkującego skrypciarza.

Uwaga. Pewnie nam nie uwierzycie, ale jak dotąd żadnemu z nas nie zdarzyło się zostać nawiedzonym przez Gretę Garbo.

Jak zapewne wiecie, po dzikiej nocy spędzonej na imprezowaniu z supermodelkami nie da się nie odczuwać czegoś na kształt wyrzutów sumienia. Podobnie i teraz: wiemy że zaniedbaliśmy sporą część naszego targetu – początkujących skrypciarzy – i obiecujemy, że się to zmieni. Dlatego też będziemy od czasu do czasu odpowiadać na prostsze pytania o skrypty. Słowo się rzekło: dzisiaj opowiemy, jak przerwać pętlę For Each. (Wiemy, że ciekawi Was ten temat, bo dostaliśmy ostatnio kilka pytań na ten temat.)

Słyszeliście? Zdaje się że to duch…

A zatem: przerywanie pętli. Powiedzmy, że mamy domenę NT 4 i chcemy określić, czy istnieje w niej określone konto użytkownika. W Active Directory zrobiłby to każdy zombie: wystarczyłoby włączyć wyszukiwanie tego konta i odpowiedź przyszłaby w ciągu paru sekund. Chodzi jednak o NT 4, który nie posiada dostawcy ADO; oznacza to, że wyszukiwanie w bazie danych z kontami jest niemożliwe w domenach NT 4.

Skąd zatem można się dowiedzieć, czy w domenie NT 4 istnieje jakieś konto użytkownika? No cóż, można zrobić to używając brutalnej siły: pobierając wszystkie konta i sprawdzając je po kolei. W tym celu najlepiej użyć pętli:

Set objComputer = GetObject("WinNT://fabrikam,domain")



For Each objItem in objComputer

    If objItem.Name = "kenmyer" Then

        Wscript.Echo "Account found."

    End If

Next

Jest to zupełnie dobry sposób, a niekiedy mozolne przekopywanie się przez wszystkie konta jest jedynym wyjściem. Problem w tym, że może to bardzo długo trwać; w domenie testowej z ok. 30 tys. kont wykonanie skryptu zajęło sporo ponad 2 minuty. Jeśli poszukiwane konto jest ostatnim w zbiorze, to niewiele można poradzić. Co jednak, jeśli zostanie ono znalezione na samym początku wyszukiwania? W takim razie i tak do zakończenia pętli For Each trzeba będzie przejrzeć pozostałe 29 999 konta.

Chyba że polecimy wprost przerwanie pętli, czyli:

Set objComputer = GetObject("WinNT://fabrikam,domain")



For Each objItem in objComputer

    If objItem.Name = "kenmyer" Then

        Wscript.Echo "Account found."

        Edit For

    End If

Next

W pierwszym skrypcie przejrzeliśmy wszystkie konta, poszukując nazwy kenmyer; znalezienie go powodowało wyświetlenie wiadomości „Account found” (konto znalezione). Podobnie w tym skrypcie, tyle że po wyświetleniu wiadomości wywołujemy instrukcję Edit For. Instrukcja ta natychmiast przerywa pętlę; jeśli konto kenmyer będzie pierwsze, do pozostałych nawet nie zajrzymy. No właśnie: wywołanie instrukcji Edit For przerywa pętlę. (Skrypciarze nie zapętają się nigdy, ale to coś zupełnie innego.)

Jeśli chcecie sprawdzić skutki wywołania instrukcji Edit For, uruchomcie poniższy skrypt, powodujący zapisanie na ekranie liczb od 1 do 1 000:

For i = 1 to 1000

    Wscript.Echo i

Next

Teraz spróbujcie z tym skryptem, który wywołuje instrukcję Edit For kiedy zmienna i jest równa 3:

For i = 1 to 1000

    Wscript.Echo i

    If i = 3 Then

        Edit For

    End If

Next

Jasne? To właśnie takie skrypty pozwalają nam nie martwić się o Gretę Garbo.

Ej, nic nie słyszeliście? Brzmiało jak łoskot łańcuchów…

Instrukcja Edit For działa w pętlach For Each i For Next loop. Co jednak zrobić, jeśli chcemy przerwać pętlę Do? Żaden problem: wystarczy wywołać polecenie Edit Do. A jeśli chcemy przerwać procedurę? Wywołać Edit Sub. Do zakończenia działania funkcji należy wywołać Edit Function. Innymi słowy, nigdy nie dacie się już złapać w błędne koło.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne