serjoga
Goto Top

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"

85.25.140.178:27024
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

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 face-sad

- 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

Content-ID: 135396

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

Ausgedruckt am: 23.11.2024 um 03:11 Uhr

rubberman
rubberman 08.02.2010 um 02:12:20 Uhr
Goto Top
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:
@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.
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
kaiand1
kaiand1 08.02.2010 um 07:19:51 Uhr
Goto Top
Moin
Das hört sich sehr nach einer Steam Favoriten Server IP Liste an füe die Spieleserver ;)
Da hab ich mal was für geschrieben für die Auswertung müßte es mal suchen wo ich es damals abgelegt habe...
Falls noch interresse besteht..
serJOga
serJOga 08.02.2010 um 10:09:40 Uhr
Goto Top
Zitat von @kaiand1:
Moin
Das hört sich sehr nach einer Steam Favoriten Server IP Liste an füe die Spieleserver ;)
Da hab ich mal was für geschrieben für die Auswertung müßte es mal suchen wo ich es damals abgelegt habe...
Falls noch interresse besteht..


Hey, gut erkannt! face-smile (wollte ich eigentlich gestern noch dazuschreiben)

Ja das IST die Steam-Favouriten-Server-IP Liste face-smile (Counter Strike Server)
Die sache ist die, ich wollte ein paar Gute Server finden für CounterStrike und habe deshalb an die 3000 Server mit Steam selber gefunden.
Nun wollte ich sie alle sortieren aber mit Steam selber ist das sehr umständlich.
Meine zweite Idee war HLSW. Das Problem ist aber das HLSW zwar Server aus Steam Importieren kann ABER keine Möglichkeit hat die Server wieder direkt in die Steam-Serverliste zu speichern... total doof wie ich finde -.-
Deshalb gehe ich diesen weg. Mal schauen ob daraus irgendwas wird face-smile

PS: Klar interesse besteht!


Zitat von @rubberman:
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.
...

3. Weiß nicht genau, was du mit Absatz meinst, aber grundsätzlich gibt es da nur den ECHO Befehl

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


Hey!

Ist ja einfacher als ich dachte :D einfach echo .... hast recht.
Werd dann mal zuhause gleich schauen [ hab grad meine "Mikrosystemtechnik" Klausur geschrieben =) ]
wie ich das nun weiter erweitern kann.

MFG SerJOga
rubberman
rubberman 08.02.2010 um 10:21:54 Uhr
Goto Top
Hallo SerJOga,

helfe dir noch ein Stück weiter (wenn man sich einmal Gedanken darüber gemacht hat face-wink ):

@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 face-wink.

Grüße
rubberman
serJOga
serJOga 08.02.2010 um 23:51:57 Uhr
Goto Top
hmm... verstehe davon leider nur wenig,
werde mich morgen näher hier im Forum mit den Tutorials zu der Batch Programmierung auseinandersetzen

Frage: Was bedeutet "goto :EOF" ?


habe hier den "PSPad Editor" er macht es alles so schön bunt face-smile


PS: kenne mich ein wenig mit der C Programmierung aus
Biber
Biber 09.02.2010 um 07:34:41 Uhr
Goto Top
Moin serJOga,

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
serJOga
serJOga 10.02.2010 um 23:52:14 Uhr
Goto Top
hmm.. irgendwie komme ich nicht weiter :|

habe bisher das zusammengefasst:


@echo off &setlocal
set n=0

call:main

:: MAIN ------------------------------------------------------------------------------------------------------
:: Spaltet IP Adresse von Port aus serverliste.txt
:: speichert IP Adresse unter der Variable a
:: speichert Port unter der Variable b
:: ruft Xping auf

:main
for /f "delims=: tokens=1*" %%a in (serverliste.txt)   

do  (
  set "IP=%%a"  
  set "line=%%a:%%b"  
  call :Xping
    )

pause
goto :eof
::--------------------------------------------------------------------------------------------------------------



:: Xping ----------------------------------------------------------------------------------------------------
:: // Pingt die IP Adresse und wenn Ping unter 80
:: // ruft write auf
 
: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
::-------------------------------------------------------------------------------------------------------------



:: write ----------------------------------------------------------------------------------------------------
:write                         
set /a n+=1

echo "%n%"  
echo {
echo "name" "%line%"  
echo "address" "%line%"  
echo "lastplayed" "123456789"  
echo "appID" "0" ;  
echo }
goto :eof
::-------------------------------------------------------------------------------------------------------------



Ich dachte mir das so ->

- main ließt jedesmal wenn sie aufgerufen wird die nächste Zeile aus der "serverliste.txt" aus und speichert sie als IP

- dann wird Xping aufgerufen
Xping Pingt die IP 20 mal, und wenn der Ping unter 80 ist wird write aufgerufen,
ansonsten springt er wieder zu main

- write schreibt die jeweilige IP in dem gegebenen Format in einer neue txt namens serverliste_sortiert.txt


Kann man so Kommentieren wie ich das gemacht habe ?
Habe ich was nicht berücksichtigt ?


mfg
rubberman
rubberman 11.02.2010 um 00:54:23 Uhr
Goto Top
Hallo serJOga,

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 face-wink

Grüße
rubberman

<edit> Zeile 57 FIND zu FINDSTR wegen merkwürdigem Fehler </edit>
serJOga
serJOga 11.02.2010 um 01:09:41 Uhr
Goto Top
Zitat von @rubberman:
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 face-wink

Grüße
rubberman

hey, danke!

hmm face-smile daran habe ich noch gar nicht gedacht ....
dann muss ich meinen PC wohl eine nacht lang laufen lassen


PS: beim Aufruf kommt bei mir das hier ->

find: 1: No such file or directory
find: 1: No such file or directory
Ein Prozess hat versucht, zu einer nicht bestehenden Pipe zu schreiben

das muss ich jetzt erstmal googeln :D
rubberman
rubberman 11.02.2010 um 01:16:27 Uhr
Goto Top
Hmm, dann funktioniert dein FIND anders als meins?!
Ändere mal zu FINDSTR
endlocal &echo %x%|findstr /c:"1">nul   

Grüße
rubberman
serJOga
serJOga 11.02.2010 um 01:25:55 Uhr
Goto Top
geht! face-smile

vielen vielen Dank für die Zeit!
Falls irgendwelche Arbeiten rund um Photoshop (Flyer, Retusche) anstehen -> anschreiben face-smile
helfe gerne wo ich kann

mfg serJOga!


PS: sagt dieser Fehler irgendwas über meinen Computer aus ?
muss ich mir Sorgen machen ?


EDIT:
Betriebssystem: Windows XP Service Pack 3
rubberman
rubberman 11.02.2010 um 01:36:19 Uhr
Goto Top
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 face-wink
Schreib mal dein OS dazu. Vielleicht hats was damit zu tun, dass es eine andere Dateiversion ist.

Grüße
rubberman
Biber
Biber 11.02.2010 um 11:30:16 Uhr
Goto Top
Moin serJoga,

PS: sagt dieser Fehler irgendwas über meinen Computer aus ?
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
serJOga
serJOga 11.02.2010 um 20:39:17 Uhr
Goto Top
Servus,

mein System ist gerade mal 2,5 Monate Neu :D ...
also ich habe Folgende Dateien in den Verzeichnissen:

Dateiname Pfad/Adresse
find.exe C:\WINDOWS\system32
findstr.exe C:\WINDOWS\system32

mfg
Biber
Biber 11.02.2010 um 22:09:26 Uhr
Goto Top
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

  • 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
serJOga
serJOga 12.02.2010 um 00:16:24 Uhr
Goto Top
^^ Redmond...
Aber die haben doch Windows! programmiert! face-smile

habt ihr den alle Linux ? oder was anderes ?

dachte batch coden ist nicht so umfangreich *duck* ... wenn ich mir das so anschaue brauche ich ja jahre um mir das beizubringen..

mfg serJO
Biber
Biber 12.02.2010 um 10:33:30 Uhr
Goto Top
Moin serJOga,

Zitat von @serJOga:
... wenn ich mir das so anschaue brauche ich ja jahre um mir das beizubringen..
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