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:
Die IPs und Beschreibungen sind natürlich nur Beispielhaft ;)
Einmal der Versuch über cmd:
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:
Folgendes bekomme ich als Ausgabe:
Soweit, so gut! Wie bekomme ich jetzt aber die Beschreibung hinter den genannten IPs bzw Hosts?
Merci !
LG Micha
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 518965
Url: https://administrator.de/contentid/518965
Ausgedruckt am: 25.11.2024 um 13:11 Uhr
17 Kommentare
Neuester Kommentar
Moin,
nimm nicht get-content, sondern import-csv:
hth
Erik
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
Einmal der Versuch über cmd:
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.@echo off
ping -n 1 1.1.1.1 %1|find "TTL=" > nul
[...]
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
Moin,
führt zu dieser Ausgabe:
weil Du nicht die Werte der einzelnen Spalten einzeln, sondern das CSV-Objekt als Ganzes ausgibst. Das muss so aussehen:
Wobei ich | als Spaltenüberschrift eher seltsam finde.
Das würde dann in der Ausgabe so aussehen:
Liebe Grüße
Erik
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.
Das würde dann in der Ausgabe so aussehen:
1.1.1.1 (Router) ist erreichbar.
Liebe Grüße
Erik
Zitat von @MiMa89:
Ginge auch die Ausgabe so?:
Aber Sicher doch ^^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
>
@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
Moin,
ändere das mal in
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
ä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
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.
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.
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.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?
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.
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 verstandenJetzt werden die Clients mit der führenden 0 gar nicht mehr angepingt bzw übersprungen.
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.Kann man diese irgendwie auskommentieren bzw. ignorieren?
Ansonsten musst du mal näher erläutern, was genau du sonst damit meinst.
Achsooo ^^
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
@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