uteliggare
Goto Top

aus Textdatei zwischen 2 Schlüsselwörtern etwas nach Variable auslesen

Hallo!

Ich benutze Qstat (www.qstat.org) um einen Gameserver zu überwachen, die Commandline sieht so aus:
qstat -old -hla2s 195.4.17.1>a.a

Und die Ausgabe so:
195.4.17.1       "#Counterstrike.de [1.6] #01 [hlstats]" map de_chateau at                 (null) 0/20 players 16 ms  

Nun möchte ich nach Lust und Laune den Server abfragen und sobald eine Map läuft die mir gefällt, ein Bild anzeigen lassen. Die nötigen Bilder existieren bereits ("nein.jpg" ist ein schwarzer Kasten, die anderen sind einfache Screenshots mit dem Namen der jeweiligen Map; zB de_chateau.jpg).

Mein bisheriges Machwerk sieht so aus:
@echo off
qstat -old -hla2s 195.4.17.1>a.a

for /f "delims== tokens=1,2" %%i in ('findstr "map" a.a') do @set map=%%i  
echo die map ist %map%

if exist c:\srvchk\%map%.jpg goto ja
c:\programme\irfanview\i_view32.exe c:\srvchk\nein.jpg
goto fertig
:ja
c:\programme\irfanview\i_view32.exe c:\srvchk\%map%.jpg
:fertig
exit


Der Wert den ich auslesen möchte steht zwischen "map" und "at" und daran scheitere ich kläglich. Die Lösungen die ich bisher gefunden hab, lesen nur ab einem Stichwort bis Zeilenende. Außerdem kann es auch sein, das der Mapname Leerzeichen enthält (Qstat unterstützt viele Games bzw Gameserver).


Ist das auslesen überhaupt per Batch machbar?

[edit]
Falls von Belang: WinXP SP2

Content-Key: 72537

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

Printed on: April 26, 2024 at 14:04 o'clock

Member: bastla
bastla Nov 02, 2007 at 08:15:00 (UTC)
Goto Top
Hallo uteliggare und willkommen im Forum!

Ist das auslesen überhaupt per Batch machbar?
Je nachdem, welche weiteren Anhaltspunkte es gäbe (zB Map-Bezeichnung beginnt an bestimmter Position, etc) könnte man's auch mit purem Batch versuchen - einfacher wird's mit einem Quäntchen (temporärem) VBScript - etwa so:
@echo off & setlocal
set "Stat=c:\srvchk\a.a"  

set "GM=%temp%\GetMap.vbs"  
echo On Error Resume Next:T=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0),1).ReadAll>"%GM%"  
echo P=Instr(T," map "):If P Then P2=InStr(P,T," at "): WScript.Echo P2:If P2 Then WScript.Echo Mid(T,P+5,P2-P-5)>>"%GM%"  

qstat -old -hla2s 195.4.17.1 >"%Stat%"  
for /f "delims=" %%i in ('cscript //nologo "%GM%" "%Stat%"') do set "map=%%i"  
del "%GM%"  

if not defined map set "map=nein"  
if not exist c:\srvchk\%map%.jpg set "map=nein"  
c:\programme\irfanview\i_view32.exe "c:\srvchk\%map%.jpg"  

Grüße
bastla
Member: uteliggare
uteliggare Nov 02, 2007 at 10:06:59 (UTC)
Goto Top
Hallo bastla,

vielen Dank für die schnelle Hilfe! Auf dem Rechner meiner Frau funktioniert das Script bestens, aber auf meinem ist der Scriptinghost disabled.
(Für die stillen Mitleser, so gehts: http://www.network-secure.de/content/view/3749/731/ )


Eigentlich bräuchte ich "nur" eine Lösung die in Variablen etwas abzählt, denn ich kann mir vorstellen das Grundprinzip, das man sich mitten aus einer Zeichenkette etwas herausschnippelt, später anderweitig zu verwenden.

Skizze:
@echo off
set map="195.4.17.1       "#Counterstrike.de [1.6] #01 [hlstats]" map de_chateau at                 (null) 0/20 players 16 ms"  

for ???1 " map " in %map% set position1=*57* (wenn die gesuchte Zeichenkette ab Position 57 wäre)  
for ???2 " at " in %map% set position2=*10* (wenn die gesuchte Zeichenkette 10 Zeichen lang wäre)  
set %map2:~position1,position2%

echo Ergebniss: %map2%

Außerdem ist mir noch etwas schleierhaft... warum steht bei dir die Variable in Zeile 2 komplett in "" und was bedeutet %%i?
%i steht ja bei "for /?" erklärt, aber zum doppelten Prozentzeichen finde ich nichts.
Ich würde gern verstehen was da passiert.

mfg, uti

PS.: bei deiner jetzigen Lösung finde ich die letzten drei Zeilen echt klever, dass erspart viel Goto-Gehopse!
Member: Biber
Biber Nov 02, 2007 at 11:20:46 (UTC)
Goto Top
Moin uteliggare,

dann mal parallel zu bastlas Strategie eine native Batch-Variante.

Ich habe auch ein paar Zeilen daraus gemacht, damit es übersichtlich bleibt.
::-------snipp ExtractMap.bat
@echo off & setlocal
for /f "delims="  %%i in ('findstr "map at " a.a') do call :findMap %%i  
goto :eof

:findmap
set ln=%*
Set ln=%ln: map =§%
Set ln=%ln: at =§%
For /f "delims=§ tokens=2" %%a in ("%ln%") do echo Map ist [%%a]  
goto :eof

Hier verwende ich zwar kein "Abzählen", sondern nehme (so wie es ja eigentlich auch logisch sein sollte) die Strings " map " und " at " als Begrenzer, als auf Neudeutsch "Delimiter".
Okay, ich mach da Ein-Zeichen-Delimiter draus ("§"-Zeichen).

Output bei dieser Skizze ist dann z.B.
Map ist [de_chateau]
Map ist ["Berlin Alexanderplatz"]  

P.S. Wenn es immer nur eine einzige Zeile bzw. Map sein kann, dann reicht natürlich:
::-------snipp ExtractOneMap.bat
@echo off & setlocal
for /f "delims="  %%i in ('findstr "map at " a.a') do Set ln=%%i  
Set ln=%ln: map =§%
Set ln=%ln: at =§%
For /f "delims=§ tokens=2" %%a in ("%ln%") do echo Map ist [%%a]  
oder weniger...

Grüße
Biber
Member: uteliggare
uteliggare Nov 02, 2007 at 11:58:00 (UTC)
Goto Top
Es funktioniert, es funktioniert! face-smile Danke Biber!

Das delims Delimiter bedeutet, wußte ich nicht, aber im Nachhinein ist's eigentlich logisch. "call :jumpmarke" und "goto :eof" sind ebenfalls interessant!
Und so langsam begreife ich auch die Funktionsweise der For-Schleife.

danke nochmals und mfg,
uti
Member: Biber
Biber Nov 02, 2007 at 18:48:15 (UTC)
Goto Top
Moin uteliggare,

ausnahmsweise, obwohl Du noch ein paar Rückfragen an bastla gerichtet hast, werde ich jetzt diesen Thread schließen.

Und dich mit Deinem Fragen zu Batch und FOR-Anweisungen und Delimiters etc dahin verweisen, wo wir auch die anderen Batch-Newbies hingeschickt haben, wenn sie erstmal auf den Geschmack gekommen waren:

  • erste und auch keine schlechte Quelle: die Einzel-Befehls-Hilfe am CMD-Prompt. ("FOR /?", "IF /?"...). Ist ein ernstgemeinter Tipp.

  • danach, mit ein wenig Grundlagen, wenn man/frau zwei oder drei Batchzeilen fließend lesen kann, dann hier im Forum im Bereich Batch & Shell ein bisschen stöbern. (BTW, oft sind die Bätche hier auch nach zwei, drei Zeilen schon zu Ende...)

  • eventuell zur Orientierung noch die paar handverlesenen Links im Bereich Batch & Shell antesten.

  • Und am wichtigsten: Nie, nie, nie einen "Profi-Bätche für jede Gelegenheit"-Kurs in einer Tankstellen-PC-Zeitschrift in die Hand nehmen.

Ich hoffe auf Dein Verständnis
Schönes Wochenende
Biber