Pętla w CMD oraz pingowanie komputerów z całej podsieci lub z pliku .txt


 

Niedawny artykuł Darka Góry o narzędziu PING podsunął mi pomysł, aby troszkę rozwinąć temat i pokazać Wam jak możemy pingować wiele komputerów na raz.

Otóż, jak wiecie PING uruchamia się z wiersza poleceń. W wierszu poleceń zaś możemy napisać prostą pętle pingującą całą podsieć:

for /L %i in (1,1,254) do ping 192.168.1.%i

To co znajduje się po słowie „do” będzie właśnie komendą. Możemy tu użyć wiele innych poleceń, ale dzisiaj zajmujemy się pingowaniem. Wartości w nawiasie oznaczają kolejno:
“od jakiej cyfry?”,”co ile cyfr?”,”do jakiej cyfry?”.
W tym wypadku pingujemy wszystkie adresy od 192.168.1.1 do 192.168.1.254. Gdybyśmy chcieli pingować fragment podsieci np. wyrywkowo co drugi komputer od 192.168.1.30 do 192.168.1.80 nasza pętla wyglądałaby następująco:

for /L %i in (30,2,80) do ping 192.168.1.%i

Problemem jaki pewnie zauważycie będzie czas wykonania tego polecenia. Nasza pętla wykona ping każdego komputera po kolei. Dla całej podsieci to ponad tysiąc pingów. Możemy zmniejszyć ich ilość na każdej maszynie z domyślnych 4 np. na 2:

for /L %i in (1,1,254) do ping 192.168.1.%i -n 2

Pewnie idealnie byłoby zapisać wynik w pliku tekstowym, gdyż CMD ma ograniczoną ilość wyświetlanych wierszy. O przekierowywaniu wyników z linii poleceń do pliku pisałem w tym artykule. Nasza pętla będzie wyglądała następująco:

for /L %i in (1,1,254) do ping 192.168.1.%i -n 2 > c:\pingowanie.txt

Może się zdarzyć, że zapragniemy pingować komputery, których nazwy lub adresy IP mamy zapisane w pliku. Tak też się da :) . W tym przykładzie nazwy komputerów zapisujemy w oddzielnych wersach w pliku komptery.txt

for /f „eol=” %i IN (komputery.txt) DO ping %i -n 2

Mam nadzieję, że opisane tutaj rozwiązania sprawnie zaimplementujecie do różnych innych celów. Szczerze zachęcam do dzielenia się własnymi przykładami zastosowań pętli w Wierszu Poleceń.


Podobne Tematy:

  • dareksin

    Witam.

    Czy da się tak jak w poniższym przykładzie …

    „W tym przykładzie nazwy komputerów zapisujemy w oddzielnych wersach w pliku komptery.txt

    for /f „eol=” %i IN (komputery.txt) DO ping %i -n 2”

    ale nie pobierając z osobnego pliku a zdefiniować je w tym samym pliku co skrypt z pętlą FOR ?

    Pozdrawiam
    Darek

  • Primo: Szacun za poprawne wykorzystywanie możliwości gmaila (+)

    Secundo: Tak:

    for %i in (nazwa1 nazwa2 nazwa3) do ping %i

  • dareksin

    Dziękuję za szybką odpowiedź.

    Niestety u mnie nie działa. Napiszę może jaki mam skrypt:

    ****************************************************************************

    :poczatek
    for /f %%i in (Wifi.ip) do call :wykonaj %%i
    goto :koniec

    :wykonaj
    start cmd /k ping %1 -t

    :koniec

    ****************************************************************************
    i powyższy skrypt działa pobierając sobie adresy z pliku Wifi.ip

    a po tym co sugerujesz wpisałem

    ****************************************************************************

    :poczatek
    for /f %%i in (194.204.159.1 194.204.152.34) do call :wykonaj %%i
    goto :koniec

    :wykonaj
    start cmd /k ping %1 -t

    :koniec

    ****************************************************************************
    System nie może odnaleźć pliku 194.204.159.1

    Niestety nie działa , zamiast pobierać kolejno adresy do pingowania , szuka takich plików.

    • Dariusz Góra

      Tak nie zadziała. FOR /F widzi kropkę to oczekuje, że to co wpisałeś to plik.
      Jeżeli wszystko chcesz mieć w jednym pliku to lepiej stworzyć sobie tablicę z adresami. Twój skrypt powinien wyglądać tak:

      ****************************************************************************
      set IP_LIST=194.204.159.1 194.204.152.34

      :poczatek
      for %%i in (%IP_LIST%) do call :wykonaj %%i
      goto :koniec

      :wykonaj
      start cmd /k ping %1 -t

      :koniec
      ****************************************************************************

  • dareksin

    Niestety nie mogę potwierdzić , że działa …

    Zamiast pingów mam :

    set IP_LIST=194.204.159.1 194.204.152.34

    for /F %i in (194.204.159.1 194.204.152.34) do call :wykonaj %i

    System nie może odnaleźć pliku 194.204.159.1.

    goto :koniec

    • Zwróć uwagę, co Darek napisał… Napierw ustawiasz wartość zmiennej IP_LIST, żeby potem i tak w nawiasach podawac adresy? ;) To bez sensu. Pozatym Darek użył pętli for bez parametru .

    • for %i in (194.204.159.1 194.204.152.34) do ping %i
      /F – sugeruje że korzystasz z pliku…

      RTFA!!! ;)

  • dareksin

    Dziękuję.

    Faktycznie problemem ( na który nie zwróciłem wcześniej uwagi ) był parametr /F .

    Po jego skasowaniu nie potrzeba wcześniej definiować zmiennej IP_LIST tylko kolejne adresy ip mozna podać w nawiasie ale czytelniej jest dać je na górze w zmiennej:

    ***

    set IP_LIST=194.204.159.1 194.204.152.34

    :poczatek
    for %%i in (%IP_LIST%) do call :wykonaj %%i
    goto :koniec

    :wykonaj
    start cmd /k ping %1 -t

    :koniec

    ***

    Jeszcze raz dziękuję za pomoc.

    Pozdrawiam
    Darek

    PS. Przy okazji miałbym jeszcze pytanie o gmaila.

    Jak poprzednio Piotr zauważył czasem użyję plusika w adresie email , ale czy jest jakiś sposób na inny pełny adres email przypisany do tego samego konta ? Wiem , że można założyć inne konto … ale nie o to pytam Alias.

  • lesar

    @echo on>c:\test.txt
    for /L %%a in (1,1,255) do (ping -n 1 192.168.1.%%a | find „TTL” >>c:\test.txt)

    Jak by ktoś chciał to ma polecenie które zapisuje do pliku tylko włączone komputery

  • Witam

    Próbuję pętle FOR wykorzystać do swoich potrzeb i tak się zastanawiam, czy w dobrym kierunku podążam.
    Mam następujący problem.
    Potrzebuję regularnie czyścić z zawartości katalog ze wszystkich plików oraz katalogów za wyjątkiem kilku z nich. Oczywiście, usuwane pliki oraz katalogi mogą za każdym razem inaczej się nazywać. Zależałoby mi na tym, aby katalogi i pliki które należy zachować, na czas usuwania zawartości nigdzie nie przenosić. Pętlą FOR w fantastyczny sposób można usuwać kolejne pozycje, pod warunkiem, że posiadam pełną listę „zbędnych” elementów. Problem w tym, jak taką listę uzyskać. O ile nie stanowi problemu wylistowania plików i zapisania ich do osobnego pliku, to problemem jest jak z tej listy wydzielić pliki które należy zachować?
    Ma ktoś pomysł jak uzyskać oczekiwany efekt? Może powinienem poszukać rozwiązania w PowerShellu?

    Pozdrawiam

    Darek

    • B3nder

      A jakie kryterium mówi, że dany katalog trzeba zachować? Data modyfikacji? Fragment nazwy?

      • Nazwa katalogu.
        Mamy na serwerze udział, do którego mają wszyscy nieograniczony dostęp, w celu udostępnienia plików innym. Oczywiście pliki powinni usuwać, czego nie czynią. W związku z tym, muszę ustawić skrypt, który będzie regularnie czyścił ten udział, na którym jednak jest kilka katalogów, które powinny zostać zachowane.

        • Podaję rozwiązanie:

          chcp 1250

          set nieusuwaj1=katalog1
          set nieusuwaj2=katalog2
          set nieusuwaj3=plik1
          set nieusuwaj4=plik2

          dir /B > del.txt
          type del.txt |findstr /V „%nieusuwaj1% %nieusuwaj2% %nieusuwaj3% %nieusuwaj4%” > Do_usuniecia.txt

          for /F „eol=” %%i IN (Do_usuniecia.txt) DO del %%i

  • Zrobiłem sobie taki skrypcik:

    @ECHO OFF
    :REPEAT
    CLS
    ECHO.
    @ECHO OFF
    ECHO.
    echo Skrypt testuje łączność w sieci LAN i do Internetu
    echo 1. Ping zdalnego hosta – wp.pl – nazwa domenowa
    echo 2. Ping zdalnego hosta – wp.pl – adres IP (przy problemach z DNS)
    echo 3. Ping bramy domyślnej – polaczenie do routera
    echo 4. Ping petli zwrotnej – poprawnosc stosu TCP/IP
    echo 5. Biezaca konfiguracja TCP/IP
    echo 6. Lacznosc wewnatrz LAN
    ECHO [] Wyjście
    ECHO.
    SET /P mreply=Enter Choice :
    IF %mreply% == 1 GOTO C1
    IF %mreply% == 2 GOTO C2
    IF %mreply% == 3 GOTO C3
    IF %mreply% == 4 GOTO C4
    IF %mreply% == 5 GOTO C5
    IF %mreply% == 6 GOTO C6
    ECHO Wybrano nieprawidlowa opcje
    PAUSE
    GOTO REPEAT
    :C1
    @ECHO ON
    mkdir C:\Diagnostyka
    ping wp.pl >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE
    GOTO REPEAT
    :C2
    @ECHO ON
    mkdir C:\Diagnostyka
    ping 212.77.100.101 >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE
    GOTO REPEAT
    :C3
    @ECHO ON
    mkdir C:\Diagnostyka
    echo Brama domyslna >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ping 192.168.1.1 >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE
    GOTO REPEAT
    :C4
    @ECHO ON
    mkdir C:\Diagnostyka
    echo Petla zwrotna >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ping 127.0.0.1 >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE
    GOTO REPEAT
    :C5
    @ECHO ON
    mkdir C:\Diagnostyka
    echo Konfiguracja IP >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ipconfig /all >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE
    GOTO REPEAT
    :C6
    @ECHO ON
    mkdir C:\Diagnostyka
    echo Brama domyslna >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    for /L %i in (1,1,254) do ping 192.168.1.%i >> „C:\Diagnostyka\%COMPUTERNAME%_%USERNAME%.txt”
    ECHO Zapisano wynik polecenia do pliku C:/Diagnostyka/%COMPUTERNAME%/%USERNAME%
    PAUSE

    Wszystko mi działa za wyjątkiem ostatniej opcji, gdzie może tkwić błąd?

  • Kamil Myśków

    Witam, Mam problem tego typu, że skanuję całą sieć, żeby sprawdzić, które IP w sieci wewnętrznej mam w danej chwili na pewno wolne.
    Chciałbym z tej pętli z przykładu zapisać wszystkie wyniki w jednym pliku, ale każdy kolejny „obrót” pętli nadpisuje mi poprzedni wynik. Jak tego uniknąć?

    Kamil.

    • Kamil Myśków

      Już sobie odpowiedziałem sam, wziąłem całą pętlę w nawiasy, a potem zapis do pliku.