Centrum skryptów - Systemy operacyjne

Jak mogę uruchomić skrypt na wielu adresach IP? 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ę uruchomić skrypt na wielu adresach IP?

Cześć Skrypciarzu! Chciałbym uruchomić skrypt na wszystkich komputerach w podsieci. Czy istnieje sposób, żeby zrobić to bez wstukiwania wszystkich adresów IP w skrypcie?

-- RB

Cześć RB! Z Twojego e-maila wnioskujemy, że chcesz mieć takie ustawienia: masz podsieć z adresami IP od 192.168.1.1 do 192.168.1.254. Chcesz utworzyć skrypt, który zacznie pracę z pierwszym numerem IP, uruchomi jakiś kod na komputerze, przejdzie do drugiego adresu, uruchomi kod i tak dalej, aż do ostatniego komputera. Co więcej, chcesz zrobić to przy pomocy możliwie najkrótszego kodu, bez wstukiwania kilkuset adresów IP.

Czy zatem istnieje jakiś sposób? Owszem, i jest prostszy, niż mogło Ci się wydawać.

Zacznijmy od pokazania, jak puścić pętlę przez wiele adresów IP. To jest tylko przykładowy kod, więc wywołuje tylko echo każdego adresu IP. Kiedy wyjaśnimy, jak działa ten skrypt, zajmiemy się bardziej praktycznym kodem:

On Error Resume Next



intStartingAddress = 1

intEndingAddress = 254

strSubnet = "192.168.1."



For i = intStartingAddress to intEndingAddress

    strComputer = strSubnet & i

    Wscript.Echo strComputer

Next

Nie, naprawdę, to już cały skrypt. Zaczynamy od przypisania wartości kilku zmiennym: zmiennej intStartingAddress przypisujemy wartość 1; zmiennej intEndingAddress – wartość 254; zmiennej strSubnet – wartość 192.168.1. (zwróć uwagę na kropkę po 1). Jak już się pewnie domyślasz, wartości te posłużą za elementy składowe przy konstruowaniu naszych adresów IP.

Po przypisaniu wartości zmiennym, tworzymy pętlę For-Next (dla następnego), która rozpocznie działanie od 1 (intStartingAddress) zakończy na 254 (intEndingAddress). Dlaczego od 1 do 254? To proste: w tych wartościach zawiera się Twój zestaw numerów IP. A jeśli Twój zestaw zawierałby się między 192.168.1.7, a 109.168.1.54? Żaden problem: użyj tej samej pętli, zmieniając jedynie wartość intStartingAddress na 7, a intEndingAddress na 54.

Wewnątrz naszej pętli łączymy wartość ciągu 192.168.1. z bieżącą wartością zmiennej pętli (i). Kiedy po raz pierwszy uruchamiamy pętlę – gdy i równa się 1 – łączymy 192.168.1. i 1. I wiesz co? W rezultacie otrzymujemy wartość 192.168.1.1, czyli pierwszy z naszych adresów IP. Kiedy uruchamiamy pętlę po raz ostatni, łączymy 192.168.1. z 254 i w rezultacie otrzymujemy wartość ostatniego adresu IP. Uruchom ten skrypt, a otrzymasz taki wynik:

192.168.1.1

192.168.1.2

192.168.1.3

192.168.1.4

Całkiem proste, prawda?

Najprawdopodobniej jednak nie interesuje Cię wywoływanie echa kilku adresów IP; zamiast tego zapewne interesuje Cię uruchomienie kodu WMI. Nie ma sprawy:

On Error Resume Next



intStartingAddress = 1

intEndingAddress = 254

strSubnet = "192.168.1."



For i = intStartingAddress to intEndingAddress

    strComputer = strSubnet & i



    Set objWMIService = GetObject _

        ("winmgmts:\\" & strComputer & "\root\cimv2")

    Set colItems = objWMIService.ExecQuery _

        ("Select * From Win32_OperatingSystem")

    For Each objItem in ColItems

        Wscript.Echo strComputer & ": " & objItem.Caption

    Next



Next

Jak widzisz, ponownie przypisujemy wartość zmiennej strComputer do adresu IP. Następnie łączymy się z usługą WMI na komputerze reprezentowanym przez ten adres. To proste, gdyż WMI potrafi łączyć się z komputerami zarówno poprzez numery IP, jak i poprzez nazwy.

Jeszcze jeden szczegół. W e-mailu wspomniałeś, że chciałbyś wyłączyć kilka numerów IP z listy, na przykład numery reprezentujące routery lub coś w tym rodzaju. Nie ma sprawy. Poniżej masz zmodyfikowany skrypt, który używa instrukcji Select Case (wybierz przypadek), aby wyłączyć konkretne komputery:

intEndingAddress = 254

strSubnet = "192.168.1."



For i = intStartingAddress to intEndingAddress

    Select Case i

        Case 10

        Case 50

        Case 100



        Case Else

            strComputer = strSubnet & i

            Set objWMIService = GetObject _

                ("winmgmts:\\" & strComputer & "\root\cimv2")

            Set colItems = objWMIService.ExecQuery _

                ("Select * From Win32_OperatingSystem")

            For Each objItem in ColItems

                Wscript.Echo strComputer & ": " & objItem.Caption

            Next



    End Select

Next

Zwróć uwagę na to, co się dzieje jeśli wartość i (ostatniego oktetu w numerze IP) równa się 10, 50, czy 100. Zgadza się: nic się nie dzieje. Jeśli komputer ma adres IP w rodzaju 192.168.1.10, 192.168.1.50, czy 192.168.1.100, nic się nie wydarzy; nie zostanie uruchomiony żaden kod WMI, a skrypt będzie po prostu działał w pętli. Kod WMI zadziała tylko w przypadku komputerów, które mają adresy IP inne od tych trzech podanych wyżej. Prosty, ale skuteczny sposób na wyeliminowanie konkretnych adresów IP z części WMI skryptu.

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne