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ń.
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
Hej, tak na szybko mogę Ci podpowiedzieć, że psexec świetnie sobie radzi z nazwami komputerów w jednej lini:
psexec.exe \\zdalny_komputer1,\\zdalny_komputer2 komenda_do_wykonania
Więcej na:
http://spece.it/windows-serwer-artykuly/psexec-exe-i-zdalnw-wykonywanie-polecen
Primo: Szacun za poprawne wykorzystywanie możliwości gmaila (+)
Secundo: Tak:
for %i in (nazwa1 nazwa2 nazwa3) do ping %i
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.
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
****************************************************************************
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!!! 😉
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.
@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
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?
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.
Już sobie odpowiedziałem sam, wziąłem całą pętlę w nawiasy, a potem zapis do pliku.
wystarczy dać dwa znaki „>>”
z linii komend jak wpisze :
for /L %i in (1,1,100) do ping 192.168.1.%i -n 4 >>C:\pingowanie.txt
działa… a jak zapisze do bat’a nie działa…
coś przeoczyłem..?
Chciałbym w Windowsie10 zrobić skrypt, który wyrzuca na pulpit okno z jakąś informacją TAK lub NIE i po kliknięciu TAK wykonuje się dalsza część skryptu, a kiedy kliknie się NIE, to okno nie zniknie dopóki nie kliknie TAK.