Serverliste nach Ping Sortieren und in eine TXT Ausgeben ?
Hallo Leute,
zur Zeit habe ich ein Problem, welches ich versuche zu lösen.
Ich habe eine Textdatei -> "serverliste.txt" in dem Format: (ca. 900 Server) "IP_ADRESSE:PORT"
Diese Serverliste wollte ich nun mit dem "ping" Befehl 20 mal "durchpingen", daraus ein Durchschnittsping erstellen
und die Adressen mit einem GRÖßEREN Ping als 80 nicht beachten, oder löschen.
Aus dieser NEUEN "serverliste_sortiert.txt" soll jetzt eine "serverliste_sortiert_formatiert.txt" werden.
Und zwar mit Solchem Format:
nun gib es hier im Forum genug Anleitungen für "textdatei auslesen und neue textdatei schreiben"
nun habe ich aber ein Paar Fragen:
- Da der Ping Befehl nur eine IP braucht OHNE den Port hinten, wie kann ich das Einlesen am besten ?
gibt es sowas wie "lese ein bis einem doppelpunkt" da ja danach der Port kommt
- Problem dabei ist das die Neue "serverliste_sortiert_formatiert.txt" aber diese Port angabe braucht
- Wie heisst der Batch-Befehl für einen Absatz ?
- Was müsste ich noch beachten ? eventuelle Denkfehler ?
PS: Wie kann ich mit der Formatierung Text einrücken ? Hab das in dem "FAQ-Formatierungen in den Beiträgen" Thread nicht gefunden.
MFG SerJOga
zur Zeit habe ich ein Problem, welches ich versuche zu lösen.
Ich habe eine Textdatei -> "serverliste.txt" in dem Format: (ca. 900 Server) "IP_ADRESSE:PORT"
85.25.140.178:27024
78.46.101.137:47015
193.36.227.96:27015
usw. ...
78.46.101.137:47015
193.36.227.96:27015
usw. ...
Diese Serverliste wollte ich nun mit dem "ping" Befehl 20 mal "durchpingen", daraus ein Durchschnittsping erstellen
und die Adressen mit einem GRÖßEREN Ping als 80 nicht beachten, oder löschen.
Aus dieser NEUEN "serverliste_sortiert.txt" soll jetzt eine "serverliste_sortiert_formatiert.txt" werden.
Und zwar mit Solchem Format:
"1" Angefangen von "1" erhöhe um 1
{
"name" "85.25.1 40.178:27024" Erste IP_ADRESSE:PORT
"address" "85.25 .140.178:27024" Erste IP_ADRESSE:PORT
"lastplayed" "123456789" Immer das Selbe
"appID" "0" ; Immer das Selbe
}
"2" Angefangen von "1" erhöhe um 1
{
"name" "78.46.1 01.137:47015" Zweite IP_ADRESSE:PORT
"address" "78.46 .101.137:47015" Zweite IP_ADRESSE:PORT
"lastplayed" "123456789 Immer das Selbe
"appID" "0" ; Immer das Selbe
}
usw. ...
Schraeger Fetter Text = Kommentar
{
"name" "85.25.1 40.178:27024" Erste IP_ADRESSE:PORT
"address" "85.25 .140.178:27024" Erste IP_ADRESSE:PORT
"lastplayed" "123456789" Immer das Selbe
"appID" "0" ; Immer das Selbe
}
"2" Angefangen von "1" erhöhe um 1
{
"name" "78.46.1 01.137:47015" Zweite IP_ADRESSE:PORT
"address" "78.46 .101.137:47015" Zweite IP_ADRESSE:PORT
"lastplayed" "123456789 Immer das Selbe
"appID" "0" ; Immer das Selbe
}
usw. ...
Schraeger Fetter Text = Kommentar
nun gib es hier im Forum genug Anleitungen für "textdatei auslesen und neue textdatei schreiben"
nun habe ich aber ein Paar Fragen:
- Da der Ping Befehl nur eine IP braucht OHNE den Port hinten, wie kann ich das Einlesen am besten ?
gibt es sowas wie "lese ein bis einem doppelpunkt" da ja danach der Port kommt
- Problem dabei ist das die Neue "serverliste_sortiert_formatiert.txt" aber diese Port angabe braucht
- Wie heisst der Batch-Befehl für einen Absatz ?
- Was müsste ich noch beachten ? eventuelle Denkfehler ?
PS: Wie kann ich mit der Formatierung Text einrücken ? Hab das in dem "FAQ-Formatierungen in den Beiträgen" Thread nicht gefunden.
MFG SerJOga
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 135396
Url: https://administrator.de/contentid/135396
Ausgedruckt am: 23.11.2024 um 03:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo SerJOga,
da du dich ja scheinbar selbst durchbeißen willst, zunächst erst mal die Antwort auf ein paar Fragen.
1. und 2. Du kannst in einer FOR /F Schleife den Delimiter (Trennzeichen) festlegen.
ungetestet:
3. Weiß nicht genau, was du mit Absatz meinst, aber grundsätzlich gibt es da nur den ECHO Befehl
erzeugt eine leere Zeile.
Es lassen sich aber auch Leerzeichen und Tabs mit ECHO ausgeben (wobei das erste Leerzeichen hinter ECHO nicht ausgegeben wird).
Hoffe das hilft schon mal weiter.
Grüße
rubberman
da du dich ja scheinbar selbst durchbeißen willst, zunächst erst mal die Antwort auf ein paar Fragen.
1. und 2. Du kannst in einer FOR /F Schleife den Delimiter (Trennzeichen) festlegen.
ungetestet:
@echo off &setlocal
set n=0
for /f "delims=: tokens=1*" %%a in (serverliste.txt) do (
set "IP=%%a"
set "line=%%a:%%b"
call :sub
)
pause
goto :eof
:sub
set /a n+=1
echo "%n%"
:: hier wirst du dir was einfallen lassen:
ping -n 20 %IP%
echo {
echo "name" "%line%"
echo "address" "%line%"
echo "lastplayed" "123456789"
echo "appID" "0" ;
echo }
goto :eof
3. Weiß nicht genau, was du mit Absatz meinst, aber grundsätzlich gibt es da nur den ECHO Befehl
echo.
Es lassen sich aber auch Leerzeichen und Tabs mit ECHO ausgeben (wobei das erste Leerzeichen hinter ECHO nicht ausgegeben wird).
Hoffe das hilft schon mal weiter.
Grüße
rubberman
Hallo SerJOga,
helfe dir noch ein Stück weiter (wenn man sich einmal Gedanken darüber gemacht hat ):
Kleine Funktion mit Beispielaufruf .
Grüße
rubberman
helfe dir noch ein Stück weiter (wenn man sich einmal Gedanken darüber gemacht hat ):
@echo off &setlocal
call :Xping 85.25.140.178 &&(
echo wird beachtet
)||(
echo wird nicht beachtet
)
pause
goto :eof
:: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Xping IPAdr
setlocal
set "Anz_Pings=20"
set "Max_ms=80"
set "x=0"
set "MW=1001ms"
for /f "tokens=9" %%a in ('ping -n %Anz_Pings% %~1 ^|findstr /i /c:"mittelwert"') do (
set "MW=%%a"
)
if %MW:ms=% leq %Max_ms% set "x=1"
endlocal &echo %x%|find "1">nul
goto :eof
Kleine Funktion mit Beispielaufruf .
Grüße
rubberman
Moin serJOga,
Ein "Goto :LabelXY" geht zu einer definierten Sprungmarke.
Heißt, wenn der Befehl "goto :LabelXY" aufgerufen wird, muss auch ein Sprungziel ":LabelXY" vorhanden sein.
Andernfalls kommt der Fehler "Sprungziel nicht gefunden" (oder so ähnlich).
Das "goto :eof" dagegen benötigt kein vorhandenes Label, sondern bedeutet sinngemäß soviel wie in anderen Programmiersprachen "RETURN" oder "RETURN TO CALLER".
-> Wenn "goto :eof " im Hauptablauf des Batches steht, wird es als RETURN, also "gehe zum Ende" interpretiert.
-> Wenn "goto :eof" am Ende eines mit "Call :LabelXY" steht, bedeutet es "RETURN TO CALLER", kehre zurück in die Zeile nach der Anweisung "call :LabelXY".
In rubbermans Schnipsel findest du beide Varianten. In Zeile 09 wird mit "goto :eof" der Hauptbatch beendet; in Zeile 24 wird mit goto :eof der Rücksprung zur Aufrufzeile des "Call :Xping" bewirkt.
In keinem der beiden Fälle ist eine Sprungmarke namens ":eof" vorhanden oder erforderlich.
Grüße
Biber
Frage: Was bedeutet "goto :EOF" ?
das "goto :Eof" hat je nach Kontext zwei Bedeutungen.Ein "Goto :LabelXY" geht zu einer definierten Sprungmarke.
Heißt, wenn der Befehl "goto :LabelXY" aufgerufen wird, muss auch ein Sprungziel ":LabelXY" vorhanden sein.
Andernfalls kommt der Fehler "Sprungziel nicht gefunden" (oder so ähnlich).
Das "goto :eof" dagegen benötigt kein vorhandenes Label, sondern bedeutet sinngemäß soviel wie in anderen Programmiersprachen "RETURN" oder "RETURN TO CALLER".
-> Wenn "goto :eof " im Hauptablauf des Batches steht, wird es als RETURN, also "gehe zum Ende" interpretiert.
-> Wenn "goto :eof" am Ende eines mit "Call :LabelXY" steht, bedeutet es "RETURN TO CALLER", kehre zurück in die Zeile nach der Anweisung "call :LabelXY".
In rubbermans Schnipsel findest du beide Varianten. In Zeile 09 wird mit "goto :eof" der Hauptbatch beendet; in Zeile 24 wird mit goto :eof der Rücksprung zur Aufrufzeile des "Call :Xping" bewirkt.
In keinem der beiden Fälle ist eine Sprungmarke namens ":eof" vorhanden oder erforderlich.
Grüße
Biber
Hallo serJOga,
ein bisschen anders würde ich schon vorgehen.
Dir muss natürlich bewusst sein, dass die Laufzeit des Batches je IP Adresse bei ca. 20 Sekunden liegt, da die Pingpakete im Abstand von einer Sekunde abgesetzt werden. Also teste erst mal mit einer kurzen Liste
Grüße
rubberman
<edit> Zeile 57 FIND zu FINDSTR wegen merkwürdigem Fehler </edit>
ein bisschen anders würde ich schon vorgehen.
- Rufe :write aus der Schleife in :main auf.
- Rufe :Xping aus :write auf und verlasse :write sofort wieder, falls :Xping einen Errorlevel >0 zurück gibt
- ansonsten mach weiter und schreibe, indem du die ECHO-Ausgaben nach "serverliste_formatiert.txt" umleitest.
@echo off &setlocal
:: main ------------------------------------------------------------------------
set n=0
:: "serverliste_formatiert.txt" anlegen/überschreiben, damit bei mehrmaligem
:: Aufruf des Batchfiles nicht ständig hinten angehängt wird
type nul>"serverliste_formatiert.txt"
:: Schleife für jede Zeile in serverliste.txt
for /f "delims=: tokens=1*" %%a in (serverliste.txt) do (
set "IP=%%a"
set "line=%%a:%%b"
call :write
)
pause
goto :eof
::------------------------------------------------------------------------------
:: write -----------------------------------------------------------------------
:write
:: :Xping aufrufen. Wenn Durchschnittswert >80ms, verlasse :write und
:: kehre zur Schleife zurück
call :Xping %IP% ||goto :eof
:: ansonsten zähle hoch und schreibe in "serverliste_formatiert.txt"
set /a n+=1
(
echo "%n%"
echo {
echo "name" "%line%"
echo "address" "%line%"
echo "lastplayed" "123456789"
echo "appID" "0" ;
echo }
echo.
)>>"serverliste_formatiert.txt"
goto :eof
::------------------------------------------------------------------------------
:: Xping -----------------------------------------------------------------------
:: Pingt die IP Adresse und wenn Ping >80ms dann Errorlevel größer 0
:Xping IPAdr
setlocal
set "Anz_Pings=20"
set "Max_ms=80"
set "x=0"
set "MW=1001ms"
for /f "tokens=9" %%a in ('ping -n %Anz_Pings% %~1 ^|findstr /i /c:"mittelwert"') do (
set "MW=%%a"
)
if %MW:ms=% leq %Max_ms% set "x=1"
endlocal &echo %x%|findstr /c:"1">nul
goto :eof
::------------------------------------------------------------------------------
Dir muss natürlich bewusst sein, dass die Laufzeit des Batches je IP Adresse bei ca. 20 Sekunden liegt, da die Pingpakete im Abstand von einer Sekunde abgesetzt werden. Also teste erst mal mit einer kurzen Liste
Grüße
rubberman
<edit> Zeile 57 FIND zu FINDSTR wegen merkwürdigem Fehler </edit>
Schätze nicht.
Mal sehen, ob Biber hier noch mal drüber stolpert. Der ist Experte für solch Phänomene und weiß sicher einen Schwank darüber zu erzählen, was sich die redmonder Praktikantinnen dabei gedacht haben
Schreib mal dein OS dazu. Vielleicht hats was damit zu tun, dass es eine andere Dateiversion ist.
Grüße
rubberman
Mal sehen, ob Biber hier noch mal drüber stolpert. Der ist Experte für solch Phänomene und weiß sicher einen Schwank darüber zu erzählen, was sich die redmonder Praktikantinnen dabei gedacht haben
Schreib mal dein OS dazu. Vielleicht hats was damit zu tun, dass es eine andere Dateiversion ist.
Grüße
rubberman
Moin serJoga,
Na ja... du musst dir nur begrenzt Sorgen machen.
Der Fehler selbst ist wohl auf die übliche Unaufgeräumtheit eines handelsüblichen Windows-Systems nach ein paar Monaten zurückzuführen.
Das, was bei Autos oder Ehefrauen "mit Gebrauchsspuren" umschrieben wird.
Es deutet jedenfalls darauf hin, dass bei dir keine Datei namens "Find[.exe]" gefunden wird im aktuellen Suchpfad.
Nachstellen kannst du diesen Fehler z.B. so:
Der eigentliche Fehlerauslöser ist ja ein Befehl wie z.B.
Wenn ich statt an "find", also an die FInd.exe an eine Nicht-existente Findx[.exe] übergebe, kommt..
Du könntest also mal recherchieren, ob/ob nicht eine Datei namens Find.exe auf deinem Rechner vorhanden ist und in welchem Pfad.
Sicherlich ist da was durcheinander.... aber Anlass für Sorgen sehe ich nicht.
Grüße
Biber
PS: sagt dieser Fehler irgendwas über meinen Computer aus ?
muss ich mir Sorgen machen ?
muss ich mir Sorgen machen ?
Na ja... du musst dir nur begrenzt Sorgen machen.
Der Fehler selbst ist wohl auf die übliche Unaufgeräumtheit eines handelsüblichen Windows-Systems nach ein paar Monaten zurückzuführen.
Das, was bei Autos oder Ehefrauen "mit Gebrauchsspuren" umschrieben wird.
Es deutet jedenfalls darauf hin, dass bei dir keine Datei namens "Find[.exe]" gefunden wird im aktuellen Suchpfad.
Nachstellen kannst du diesen Fehler z.B. so:
Der eigentliche Fehlerauslöser ist ja ein Befehl wie z.B.
echo text|find "suchwort"
-bzw. konkreter mit den beiden möglichen Gefunden/Nicht gefunden-Ergebnissen
echo 23|find "1"
[keine Ausgabe, nicht gefunden]
echo 13|find "1"
13 [Gefunden-Ausgabe]
Wenn ich statt an "find", also an die FInd.exe an eine Nicht-existente Findx[.exe] übergebe, kommt..
>echo 23|findx "1"
Der Befehl "findx" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Ein Prozess hat versucht, zu einer nicht bestehenden Pipe zu schreiben.
# jedenfalls beim ersten Mal. ein Versuch der Reproduktion...
>echo 23|findx "1"
Der Befehl "findx" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
[ beim 2ten, 3ten, xten Mal kommt die "nicht bestehende Pipe" nicht wieder.
*seufz*....Redmond....]
Du könntest also mal recherchieren, ob/ob nicht eine Datei namens Find.exe auf deinem Rechner vorhanden ist und in welchem Pfad.
Sicherlich ist da was durcheinander.... aber Anlass für Sorgen sehe ich nicht.
Grüße
Biber
Moin serJOga,
okay... dann liegt es nicht daran, dass die Find.exe nicht gefunden wird, sondern vermutlich daran, dass die nicht so robust ist wie die Findstr.exe.
Sowohl Find.exe wie auch diese facegeliftete neuere FindStr.exe sind ja beide (primär) für Textdateien gedacht, also für irgendetwas, das Zeilen hat.
Zeilen wiederum sind unter Windows erkennbar
Wenn aber irgendwelche Hobbycoder aus Orten mit dem Anfangsbuchstaben R so etwas wie eine Ping-Ausgabe zusammenbraten, dann kann es passieren, dass eine Zeile nicht mit CRLF (hex0D+hex0A) endet, sondern mit CRCRLF (hex0D+Hex0D+Hex0A).
Das ist in der Ergebniszeile-Zeile der Ping-Ausgabe mit dem Wort "Mittelwert" definitiv der Fall. die Ausgabe endet mit [..6D 73 0D 0D 0A] =["...ms"+CR+CR+LF]
Das bringt die/deine Find.exe offensichtlich durcheinander, die Findstr.exe scheint damit leben zu können.
Zumindest diese eine Zeile wird jedenfalls verstümmelt - Beispiel am CMD-Prompt
Kommt auch bei mir/meiner Find.exe nicht das heraus, was herauskommen sollte.... villeicht hat auch der FOR/F-befehl seine Probleme mit diesem CRCRLF.
Fazit:
Wenn du ein paar Windows-Programme dazu gebracht hast, sinnvoll miteinander zu kommunizieren: Ändere nie wieder etwas an der Konstellation.
In deinem Fall: bleibe bei FindStr.exe statt Find.exe
Grüße
Biber
okay... dann liegt es nicht daran, dass die Find.exe nicht gefunden wird, sondern vermutlich daran, dass die nicht so robust ist wie die Findstr.exe.
Sowohl Find.exe wie auch diese facegeliftete neuere FindStr.exe sind ja beide (primär) für Textdateien gedacht, also für irgendetwas, das Zeilen hat.
Zeilen wiederum sind unter Windows erkennbar
- durch ein Zwei-Zeichen-Zeilenende [=CRLF =Chr(13)+Chr(10) = hex0D +Hex0A] (das nur in der letzten zeile einer Textdatei fehlen darf) und
- eine bestimmbare Länge "Text" vor einem Zeilenende
Wenn aber irgendwelche Hobbycoder aus Orten mit dem Anfangsbuchstaben R so etwas wie eine Ping-Ausgabe zusammenbraten, dann kann es passieren, dass eine Zeile nicht mit CRLF (hex0D+hex0A) endet, sondern mit CRCRLF (hex0D+Hex0D+Hex0A).
Das ist in der Ergebniszeile-Zeile der Ping-Ausgabe mit dem Wort "Mittelwert" definitiv der Fall. die Ausgabe endet mit [..6D 73 0D 0D 0A] =["...ms"+CR+CR+LF]
Das bringt die/deine Find.exe offensichtlich durcheinander, die Findstr.exe scheint damit leben zu können.
Zumindest diese eine Zeile wird jedenfalls verstümmelt - Beispiel am CMD-Prompt
>for /f "tokens=*" %a in ('ping -n 2 localhost^|find /i "mittelwert"') do @echo [%a]
]Minimum = 0ms, Maximum = 0ms, Mittelwert = 0ms
>for /f "tokens=7-9" %a in ('ping -n 2 localhost^|find /i "mittelwert"') do @echo [%a] b[%b] c[%c]
]Mittelwert] b[=] c[0ms
Kommt auch bei mir/meiner Find.exe nicht das heraus, was herauskommen sollte.... villeicht hat auch der FOR/F-befehl seine Probleme mit diesem CRCRLF.
Fazit:
Wenn du ein paar Windows-Programme dazu gebracht hast, sinnvoll miteinander zu kommunizieren: Ändere nie wieder etwas an der Konstellation.
In deinem Fall: bleibe bei FindStr.exe statt Find.exe
Grüße
Biber
Moin serJOga,
Sieh es positiv: dann bist immer noch um Jahrzehnte schneller als diese HoffnungsträgerInnen aus R.
Was mich allerdings brennend interessieren würde:
Machen die dort auch Freigaben?
Kennen die Abnahmetests? Oder gibt es dafür im Neudeutschen gar keine Vokabel?
Meine Vermutung ist, dass das englische Wort acceptance test zwar auch "Abnahmetest" bedeuten kann...
Aber bei Bunter-Bläschen-Software wohl auch meint "austesten, was der Kunde so grad noch akzeptiert".
Hätte ich in meiner Jugend gewusst, dass Unverfrorenheit das eigentliche Geheimnis eines globalen Monopolisten ist.... egal, vorbei.
Grüße
Biber
Sieh es positiv: dann bist immer noch um Jahrzehnte schneller als diese HoffnungsträgerInnen aus R.
Was mich allerdings brennend interessieren würde:
Machen die dort auch Freigaben?
Kennen die Abnahmetests? Oder gibt es dafür im Neudeutschen gar keine Vokabel?
Meine Vermutung ist, dass das englische Wort acceptance test zwar auch "Abnahmetest" bedeuten kann...
Aber bei Bunter-Bläschen-Software wohl auch meint "austesten, was der Kunde so grad noch akzeptiert".
Hätte ich in meiner Jugend gewusst, dass Unverfrorenheit das eigentliche Geheimnis eines globalen Monopolisten ist.... egal, vorbei.
Grüße
Biber