mima89
Goto Top

Batch-Ping per Host-Liste

Moin Zusammen,

ich habe für den einen oder anderen bestimmt eine einfach Frage, an der ich momentan verzweifel^^


Ich habe eine CSV zur Hand in der Hostnamen und deren Beschreibung enthalten ist.
Ich möchte mir nun eine kleine Ausgabe zusammenbasteln, die mir die Erreichbarkeit der Systeme + Beschreibung wiedergibt.

Beispiel:
Host - Beschreibung
1.1.1.1 - Router
2.2.2.2 - Switch

Die IPs und Beschreibungen sind natürlich nur Beispielhaft ;)


Einmal der Versuch über cmd:

@echo off
ping -n 1 1.1.1.1 %1|find "TTL=" > nul  

if %errorlevel%==1 goto nein

echo %1- Router ist Online
goto switch

:nein
echo %1- Router ist nicht Online
pause

:switch
ping -n 1 2.2.2.2 %1|find "TTL=" > nul  

if %errorlevel%==1 goto nein2

echo %1- Switch ist Online
pause

:nein2
echo %1- Switch ist nicht Online
pause

Hier bekomme ich aber nur mist raus und verkettbar ist es auch irgendwie nicht und wenn ich keine Pause mache, schließt sich das Fenster ...

Der zweite Versuch über Powershell klappt besser:

$ServerName = Get-Content ".\hosts.csv"    
  
foreach ($Server in $ServerName) {

    if (test-Connection -ComputerName $Server -Count 2 -Quiet ) { 

        write-Host "$Server ist Online! " -ForegroundColor Green  

                } else

                { Write-host "$Server ist nicht Erreichbar!" -ForegroundColor Red  

                }   

} 

Folgendes bekomme ich als Ausgabe:

1.1.1.1 ist Online! 
2.2.2.ist Online! 

Soweit, so gut! Wie bekomme ich jetzt aber die Beschreibung hinter den genannten IPs bzw Hosts?


Merci !
LG Micha

Content-Key: 518965

Url: https://administrator.de/contentid/518965

Printed on: April 20, 2024 at 03:04 o'clock

Member: erikro
erikro Nov 25, 2019 at 14:57:16 (UTC)
Goto Top
Moin,

nimm nicht get-content, sondern import-csv:

$Servers = import-csv ".\hosts.csv"  -delimiter "-"  
  
foreach ($Server in $Servers) {

    if (test-Connection -ComputerName $Server.Host -Count 2 -Quiet ) { 

        write-Host "$Server.Host - $server.Beschreibung ist Online! " -ForegroundColor Green  

                } else

                { Write-host "$Server.Host - $server.beschreibung ist nicht Erreichbar!" -ForegroundColor Red  

                }   

} 

hth

Erik
Member: MiMa89
MiMa89 Nov 26, 2019 at 08:09:13 (UTC)
Goto Top
Prinzipiell schon mal gut, allerdings musste ich es ein wenig abändern da mir die Werte doppelt ausgegeben wurden.

Script:
$Servers = import-csv ".\hosts.csv"  -delimiter ";"  
  
foreach ($Server in $Servers) {

    if (test-Connection -Computername $Server.Host -Count 2 -Quiet ) { 

        write-Host "$Server ist Online! " -ForegroundColor Green  

                } else

                { Write-host "$Server nicht Erreichbar!" -ForegroundColor Red  

                }   

} 

Die csv so:
Host;|
1.1.1.1;Router
2.2.2.2;Switch
Computer01;Computer


Nun sieht die Ausgabe aber so aus:
@{Host=1.1.1.1; |=Router} ist Online! 
@{Host=2.2.2.2; |=Switch} ist Online! 
@{Host=Computer01; |=Computer} nicht Erreichbar!
Member: TK1987
Solution TK1987 Nov 26, 2019 updated at 08:32:16 (UTC)
Goto Top
Einmal der Versuch über cmd:
@echo off
ping -n 1 1.1.1.1 %1|find "TTL=" > nul  
[...]
Hier bekomme ich aber nur mist raus [...]
Ist auch kein Wunder. Du rufst dauernd mit %1 das erste übergebene Argument auf, ich sehe aber nicht, dass du überhaupt irgendwelche Argumente übergibst. Mit goto kann man im übrigen auch gar keine Argumente übergeben, dass geht nur mit call. Darüber hinaus wäre hier für deine Anforderung lediglich eine einzige For-Schleife notwendig.

Mit deiner CSV-Datei als Beispiel, sähe das Batchscript dann so aus:
@echo off
setlocal enabledelayedexpansion

for /f "skip=1 usebackq Tokens=1,2 Delims=- " %%a in ("C:\Pfad\zur\Datei.csv") do (  
	ping -n 1 %%a | findstr "TTL" > nul  
	if !errorlevel! equ 0 (echo %%b ist online) else (echo %%b ist offline)
	)

pause 
C:\Pfad\zur\Datei.csv muss natürlich mit dem Pfad deiner CSV-Datei ersetzt werden.
Member: erikro
erikro Nov 26, 2019 updated at 08:55:18 (UTC)
Goto Top
Moin,

Zitat von @MiMa89:
>         write-Host "$Server ist Online! " -ForegroundColor Green  
> 
>         Write-host "$Server nicht Erreichbar!" -ForegroundColor Red  
> 

führt zu dieser Ausgabe:

@{Host=1.1.1.1; |=Router} ist Online! 
> @{Host=2.2.2.2; |=Switch} ist Online! 
> @{Host=Computer01; |=Computer} nicht Erreichbar!

weil Du nicht die Werte der einzelnen Spalten einzeln, sondern das CSV-Objekt als Ganzes ausgibst. Das muss so aussehen:

write-host "$server.host ($server.|) ist erreichbar."  

Wobei ich | als Spaltenüberschrift eher seltsam finde. face-wink

Das würde dann in der Ausgabe so aussehen:

1.1.1.1 (Router) ist erreichbar.

Liebe Grüße

Erik
Member: MiMa89
MiMa89 Nov 26, 2019 updated at 09:05:12 (UTC)
Goto Top
Das ist die Lösung, Danke! face-smile


Wäre noch folgende Änderung möglich?

Ich bekomme folgendes als Ausgabe:

Router ist Online
Switch ist Online
Computer01 ist Online

Ginge auch die Ausgabe so?:
1.1.1.1 - Router ist Online
2.2.2.2 - Switch ist Online
3.3.3.3 -  Computer01 ist Online

Sodass die erste Spalte in der CSV in die Ausgabe mitgenommen wird.
Member: MiMa89
MiMa89 Nov 26, 2019 at 09:04:40 (UTC)
Goto Top
Ich mache das " | " in der Spaltenüberschrift, da ich das Wort "Beschreibung" nicht mit in der Ausgabe haben wollte.

Mit der Überschrift "Beschreibung" und deinem geänderten "write-host" Befehl sieht es nämlich nun so aus:
(@{Host=1.1.1.1; Beschreibung=Router}.|) ist erreichbar.
(@{Host=2.2.2.2; Beschreibung=Switch}.|) ist erreichbar.
(@{Host=Computer01; Beschreibung=Computer}.|) ist erreichbar.
Member: TK1987
Solution TK1987 Nov 26, 2019 at 09:05:37 (UTC)
Goto Top
Zitat von @MiMa89:
Ginge auch die Ausgabe so?:
1.1.1.1 - Router ist Online
> 2.2.2.2 - Switch ist Online
> 3.3.3.3 . Computer01 ist Online
> 
Aber Sicher doch ^^
@echo off
setlocal enabledelayedexpansion

for /f "skip=1 usebackq Tokens=1,2 Delims=- " %%a in ("C:\Pfad\zur\Datei.csv") do (  
	ping -n 1 %%a | findstr "TTL" > nul  
	if !errorlevel! equ 0 (echo %%a - %%b ist online) else (echo %%a - %%b ist offline)
	)

pause 
Member: MiMa89
MiMa89 Nov 26, 2019 at 09:13:47 (UTC)
Goto Top
So, mehr wollte ich gar nicht :D

Cool Danke!

Das %%a und %%b steht für die Spalten, ahhhh.

So einfach kann es manchmal sein.


Danke euch beiden! face-smile
Member: erikro
erikro Nov 26, 2019 at 09:21:05 (UTC)
Goto Top
Moin,

ändere das mal in
write-host "$($server.host) ($($server.beschreibung)) ist erreichbar.  

Zum grundsätzlichen Verständnis des Umgangs mit CSV mit der PS ein Link: https://www.msxfaq.de/code/powershell/pscsv.htm

Liebe Grüße

Erik
Member: TK1987
TK1987 Nov 26, 2019 at 09:29:11 (UTC)
Goto Top
Zitat von @MiMa89:
Das %%a und %%b steht für die Spalten, ahhhh.
Genau ^^

Mit "Tokens=1,2" sagt man, dass die erste Zeichenkette in die erste Variable; und die zweite in den nächstfolgenden Buchstaben geschrieben wird (da wir mit %%a angefangen haben folgt also %%b).
Standardmäßig werden Leerzeichen als Trennzeichen verwendet - mit "Delims=- " sage man in dem Fall, das Minus und Leerzeichen als Trennzeichen verwendet werden.
Member: MiMa89
MiMa89 Jan 17, 2020 at 10:27:39 (UTC)
Goto Top
Hello!
Ich hab da noch ein kurioses Problem, was mir erst heute aufgefallen ist :D

Sobald die IP eine voranstehende 0 enthält (z.B. 2.02.02.2), schlägt der Ping-Versuch fehl.
Kann man diese irgendwie auskommentieren bzw. ignorieren?
Member: TK1987
TK1987 Jan 17, 2020 at 13:34:25 (UTC)
Goto Top
Zitat von @MiMa89:
Sobald die IP eine voranstehende 0 enthält (z.B. 2.02.02.2), schlägt der Ping-Versuch fehl.
Nicht so ganz, es gibt halt keine führenden Nullen bei IP-Adressen, deswegen werden diese einfach weggelassen - bei ping 2.02.02.2 wird also 2.2.2.2 angepingt.
Kann man diese irgendwie auskommentieren bzw. ignorieren?
Natürlich ist das prinzipiell möglich.
@echo off
setlocal enabledelayedexpansion

for /f "skip=1 usebackq Tokens=1,2 Delims=- " %%a in ("C:\Pfad\zur\Datei.csv") do (  
	echo %%a | findstr "^0 \.0" >nul ||  (  
		ping -n 1 %%a | findstr "TTL" > nul  
		if !errorlevel! equ 0 (echo %%a - %%b ist online) else (echo %%a - %%b ist offline)
		)
	)

pause 

Zuerst wird in die Ip-Adresse mit echo ausgegeben, darin suchen wir mit findstr nach einer 0 komplett am Anfang der Zeichenkette ("^0") und nach einer 0 die auf einen Punkt folgt ("\.0"). Werden keine solche gefunden, wird wie gehabt der Rest ausgeführt.
Member: MiMa89
MiMa89 Jan 20, 2020 at 08:21:22 (UTC)
Goto Top
Jetzt werden die Clients mit der führenden 0 gar nicht mehr angepingt bzw übersprungen.


Die Clients die keine führende 0 in der IP haben bzw. die regulären Hostnamen werden aber weiterhin korrekt angepingt.
Member: TK1987
TK1987 Jan 20, 2020 at 17:21:50 (UTC)
Goto Top
Zitat von @MiMa89:
Jetzt werden die Clients mit der führenden 0 gar nicht mehr angepingt bzw übersprungen.
Genau so hatte ich dein Vorhaben auch verstanden
Sobald die IP eine voranstehende 0 enthält (z.B. 2.02.02.2), schlägt der Ping-Versuch fehl.
Kann man diese irgendwie auskommentieren bzw. ignorieren?
-> IP's mit voranstehender 0 werden ignoriert.

Ansonsten musst du mal näher erläutern, was genau du sonst damit meinst.
Member: MiMa89
MiMa89 Jan 21, 2020 at 07:26:29 (UTC)
Goto Top
Neiiiiiiiiiin... Sorry für das Missverständnis :D


Nicht die IPs sollen ignoriert werden, sondern die voranstehende Null soll aus der IP herausgefiltert oder ignoriert werden.
Sodass ein normaler Ping möglich ist..

Weil Ergebnis der Batch z.B.

2.02.02.2 (wird nicht gefunden...)


Sobald ich die IP manuell anpinge mit der 2.2.2.2 wird die aufgelöst..
Member: TK1987
Solution TK1987 Jan 21, 2020 updated at 14:23:08 (UTC)
Goto Top
Achsooo ^^

@echo off
setlocal enabledelayedexpansion

for /f "skip=1 usebackq Tokens=1,2 Delims=- " %%a in ("C:\Pfad\zur\Datei.csv") do (  
	set IP=.%%a
	set IP=!IP:.0=.!
	set IP=!IP:.0=.!
	set IP=!IP:~1!
	
	ping -n 1 !IP! | findstr "TTL" > nul  
	if !errorlevel! equ 0 (echo !IP! - %%b ist online) else (echo !IP! - %%b ist offline)
	)

pause

Die Ip wird erstmal in die Variable IP geschrieben. Da Batch beim keine regulären Ausdrüke für den Variablenanfang kennt, habe ich vor die Variable einen Punkt angefügt, um auch dort Nullen mit zu ersetzen.
Anschließend wird in der Variable IP in zwei durchläufen ".0" duch "." ersetzt. Zum Schluss wird der Punkt am Anfang der Variable wieder entfernt.

Gruß TK1987
Member: MiMa89
MiMa89 Jan 22, 2020 at 16:34:45 (UTC)
Goto Top
Nice Danke funktioniert!!

Liebe Grüße Micha