Pingscript
Hallo, mein Ausbilder hat mir als Aufgabe gegeben, dass ich ein Script schreiben soll, in dem eine Liste von Rechnern angepingt werden.
Alle Rechner die nicht angepingt werden können, sollen dann in einer Textdatei stehen.
Die Liste der Rechner steht in einer Rechner.txt
Ich weiß nun nicht wie ich da ganz vorgehen soll.
Also ich habe so gut wie keine Ahnung im Bash.
Ich habe angefangen in der Rechner.txt überall ein ping vor zusetzen:
ping Rechner1
ping Rechner2
zursätzlich habe ich dann die Auswertung in eine extra Datei schreiben lassen
ping Rechner1 >>Protokoll.txt
ping Rechner2 >>Protokoll.txt
...
Ist das der Richtige Ansatz oder wie kann man das geschickter lösen?
Alle Rechner die nicht angepingt werden können, sollen dann in einer Textdatei stehen.
Die Liste der Rechner steht in einer Rechner.txt
Ich weiß nun nicht wie ich da ganz vorgehen soll.
Also ich habe so gut wie keine Ahnung im Bash.
Ich habe angefangen in der Rechner.txt überall ein ping vor zusetzen:
ping Rechner1
ping Rechner2
zursätzlich habe ich dann die Auswertung in eine extra Datei schreiben lassen
ping Rechner1 >>Protokoll.txt
ping Rechner2 >>Protokoll.txt
...
Ist das der Richtige Ansatz oder wie kann man das geschickter lösen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 99096
Url: https://administrator.de/forum/pingscript-99096.html
Ausgedruckt am: 17.04.2025 um 13:04 Uhr
18 Kommentare
Neuester Kommentar
Moin rique1me,
willkommen im Forum.
In der Rechner.txt sollten nur die Rechnernamen stehen, sonst nix.
Bitte nutze die interne Suchfunktion, nachdem Du nochmal überprüft hast, ob Du es unter Batch oder bash lösen willst.
Grüße
Biber
willkommen im Forum.
Also ich habe so gut wie keine Ahnung im Bash.
Also arbeitet ihr unter einem Unix-System und nicht unter Windows? Unter welchem?Ich habe angefangen in der Rechner.txt überall ein ping vor zusetzen:
Lass die sinnvolle Trennung von "Programm" und "Daten" bestehen.In der Rechner.txt sollten nur die Rechnernamen stehen, sonst nix.
zursätzlich habe ich dann die Auswertung in eine extra Datei schreiben lassen
Wie würdest Du den Unterschied zwischen "Auswertung" und "alles, was mir Ping.exe auf den Bildschirm schreibt" formulieren?Ist das der Richtige Ansatz oder wie kann man das geschickter lösen?
Auf Oder-Fragen gibt es nur eine Antwort: natürlich!Bitte nutze die interne Suchfunktion, nachdem Du nochmal überprüft hast, ob Du es unter Batch oder bash lösen willst.
Grüße
Biber
Moin rique1me,
Danke für die schnelle Beantwortung der ersten zwei Fragen...
Hast Du meine anderen Nachfragen/Hinweise gelesen?
Die sollten Dich schon auf den richtigen Weg bringen...
ist doch sicher in Deinem Sinne, wenn Du hier Hilfe zur Lösung bekommst und nicht eine Fertig-Lösung, oder?
Grüße
Biber
Danke für die schnelle Beantwortung der ersten zwei Fragen...
Wie gesagt das Ziel ist es das eine Liste von Rechner angepingt wird.
Die Sachverhalte, die ich glaubte verstanden zu haben, habe ich gar nicht nochmal angefragt..*ggHast Du meine anderen Nachfragen/Hinweise gelesen?
Die sollten Dich schon auf den richtigen Weg bringen...
ist doch sicher in Deinem Sinne, wenn Du hier Hilfe zur Lösung bekommst und nicht eine Fertig-Lösung, oder?
Grüße
Biber
In Batch (nicht getestet, schreibe es jetz kurz aus dem Kopf):
In PowerShell (ebenfalls nicht getestet):
So.
Nun erwarte ich eine kurze Erklärung zumindest von einem der beiden Scripts in Pseudocode, damit der Lerneffekt gewährleistet ist.
@echo off
for /f %%a in (C:\yourfile.txt) do call :processline %%a
goto :eof
:processline
echo Pinge %1 ...
ping -n 1 %1 | find /i "TTL" >nul
if errorlevel==0 (
echo %1 pingbar!
) else (
echo %1
echo %1 nicht pingbar! >>c:\pinglog.txt
)
In PowerShell (ebenfalls nicht getestet):
function fcnPing ($geraet) {
$ping = Get-WmiObject win32_pingstatus -Filter "Address='$geraet'"
if ($ping.statuscode -eq "0") {
$ausgabe = $geraet + " pingbar!"
write-host $ausgabe
} else {
$ausgabe = $geraet + " nicht pingbar!"
write-host $ausgabe
$ausgabe | out-file -filepath C:\pinglog.txt -encoding default -append
}
}
foreach ($pc in get-content C:\yourfile.txt) {fcnPing $pc}
So.
Nun erwarte ich eine kurze Erklärung zumindest von einem der beiden Scripts in Pseudocode, damit der Lerneffekt gewährleistet ist.
Welches hast du genommen?
Das Batchscript oder das in PowerShell?
Wenn du das Batchscript genommen hast, stimmt meine Errorlevel-Abfrage nicht.
Unter welchem Betriebsystem arbeitest du?
Die Errorlevel-Abfrage ist von OS zu OS unterschiedlich....
Versuchs mal so:
Oder so:
Oder so:
Oder so:
PS: Hast du den Code verstanden? Ich will eine kurze Erklärung, was das Script genau macht ("Es pingt alle Clients in der Liste" reicht nicht).
Das Batchscript oder das in PowerShell?
Wenn du das Batchscript genommen hast, stimmt meine Errorlevel-Abfrage nicht.
Unter welchem Betriebsystem arbeitest du?
Die Errorlevel-Abfrage ist von OS zu OS unterschiedlich....
Versuchs mal so:
if errorlevel 0 (
if "%errorlevel%"=="0" (
if %errorlevel%==0 (
if %errorlevel%=0 (
PS: Hast du den Code verstanden? Ich will eine kurze Erklärung, was das Script genau macht ("Es pingt alle Clients in der Liste" reicht nicht).
War ja schon gar nicht schlecht. Zur Ergänzung/Berichtigung:
Ist eigentlich eine Foreach-Schleife. Für jede Linie im Texfile Rechner.txt wird zum Sprungpunkt "processline" gesprungen. Dabei wird der Parameter %%a mitgegeben, was eine Variable ist, in der dein Rechnername aus dem Textfile mitgegeben wird.
Führt zuerst mal einen Ping aus. "-n 1" bedeutet, dass nur ein Ping-Paket geschickt wird.
Danach wird mit dem Befehl "find" in der Ausgabe des Pings nach der Zeichenfolge "TTL" gesucht. Dies darum, weil die Ausgabe "Antwort von ..." (also ein erfolgreicher Ping) die einzige Ausgabe von Ping ist, die die Zeichenfolge "TTL" drin hat. Die anderen möglichen Ausgaben von Ping ("Unknown Host", "Request Timed Out", "Destination Host Unreacheable") haben diese Zeichenfolge alle nicht drin. Kurz gesagt: Ist die Zeichenfolge "TTL" in der Ausgabe drin, war der Ping erfolgreich.
Das ">nul" sorgt dafür, dass für diesen Befehl keine Bildschirmausgabe ausgegeben wird.
Wenn nun also die Zeichenkette "TTL" gefunden wird (der Ping also erfolgreich war), generiert der find-Befehl einen Errorlevel mit dem Inhalt "0". Wenn diese nicht gefunden wird, generiert der find-Befehl einen Errorlevel mit dem Inhalt "1". Dann kommt die folgende Abfrage zum Zug:
So wird unterschieden, ob der PC nun pingbar ist oder nicht.
PS: Fürs erste Mal wars nicht schlecht....
PPS: Ich weiss, theoretisch könnte man mit dem Find-Befehl auch nach "Antwort" oder so etwas suchen. Das Script funktioniert dann aber nicht mehr, wenn du an einen Rechner kommst, auf dem ein anderssprachiges OS installiert ist. Mit der Suche nach der Zeichenfolge "TTL" funktioniert dein Script überall auf der Welt.
for /f %%a in (i:\test\Rechner.txt) do call :processline %%a
ping -n 1 %1 | find /i "TTL" >nul
Danach wird mit dem Befehl "find" in der Ausgabe des Pings nach der Zeichenfolge "TTL" gesucht. Dies darum, weil die Ausgabe "Antwort von ..." (also ein erfolgreicher Ping) die einzige Ausgabe von Ping ist, die die Zeichenfolge "TTL" drin hat. Die anderen möglichen Ausgaben von Ping ("Unknown Host", "Request Timed Out", "Destination Host Unreacheable") haben diese Zeichenfolge alle nicht drin. Kurz gesagt: Ist die Zeichenfolge "TTL" in der Ausgabe drin, war der Ping erfolgreich.
Das ">nul" sorgt dafür, dass für diesen Befehl keine Bildschirmausgabe ausgegeben wird.
Wenn nun also die Zeichenkette "TTL" gefunden wird (der Ping also erfolgreich war), generiert der find-Befehl einen Errorlevel mit dem Inhalt "0". Wenn diese nicht gefunden wird, generiert der find-Befehl einen Errorlevel mit dem Inhalt "1". Dann kommt die folgende Abfrage zum Zug:
if errorlevel==0 (
PS: Fürs erste Mal wars nicht schlecht....
PPS: Ich weiss, theoretisch könnte man mit dem Find-Befehl auch nach "Antwort" oder so etwas suchen. Das Script funktioniert dann aber nicht mehr, wenn du an einen Rechner kommst, auf dem ein anderssprachiges OS installiert ist. Mit der Suche nach der Zeichenfolge "TTL" funktioniert dein Script überall auf der Welt.
@TuXHunt3R
Grüße
bastla
War das unter Windows 2000 auch schon so?
Hätte so sein sollen, funktionierte aber nicht, und deshalb die Klimmzüge mit "find"/"findstr" ...Grüße
bastla