Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: uteliggare

uteliggare (Level 1) - Jetzt verbinden

02.11.2007, aktualisiert 19:48 Uhr, 4218 Aufrufe, 5 Kommentare

Hallo!

Ich benutze Qstat (www.qstat.org) um einen Gameserver zu überwachen, die Commandline sieht so aus:
01.
qstat -old -hla2s 195.4.17.1>a.a
Und die Ausgabe so:
01.
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:
01.
@echo off 
02.
qstat -old -hla2s 195.4.17.1>a.a 
03.
 
04.
for /f "delims== tokens=1,2" %%i in ('findstr "map" a.a') do @set map=%%i 
05.
echo die map ist %map% 
06.
 
07.
if exist c:\srvchk\%map%.jpg goto ja 
08.
c:\programme\irfanview\i_view32.exe c:\srvchk\nein.jpg 
09.
goto fertig 
10.
:ja 
11.
c:\programme\irfanview\i_view32.exe c:\srvchk\%map%.jpg 
12.
:fertig 
13.
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
Mitglied: bastla
02.11.2007 um 09:15 Uhr
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:
01.
@echo off & setlocal 
02.
set "Stat=c:\srvchk\a.a" 
03.
 
04.
set "GM=%temp%\GetMap.vbs" 
05.
echo On Error Resume Next:T=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0),1).ReadAll>"%GM%" 
06.
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%" 
07.
 
08.
qstat -old -hla2s 195.4.17.1 >"%Stat%" 
09.
for /f "delims=" %%i in ('cscript //nologo "%GM%" "%Stat%"') do set "map=%%i" 
10.
del "%GM%" 
11.
 
12.
if not defined map set "map=nein" 
13.
if not exist c:\srvchk\%map%.jpg set "map=nein" 
14.
c:\programme\irfanview\i_view32.exe "c:\srvchk\%map%.jpg"
Grüße
bastla
Bitte warten ..
Mitglied: uteliggare
02.11.2007 um 11:06 Uhr
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:
01.
@echo off 
02.
set map="195.4.17.1       "#Counterstrike.de [1.6] #01 [hlstats]" map de_chateau at                 (null) 0/20 players 16 ms" 
03.
 
04.
for ???1 " map " in %map% set position1=*57* (wenn die gesuchte Zeichenkette ab Position 57 wäre) 
05.
for ???2 " at " in %map% set position2=*10* (wenn die gesuchte Zeichenkette 10 Zeichen lang wäre) 
06.
set %map2:~position1,position2% 
07.
 
08.
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.

Mit freundlichen Grüßen, uti

PS.: bei deiner jetzigen Lösung finde ich die letzten drei Zeilen echt klever, dass erspart viel Goto-Gehopse!
Bitte warten ..
Mitglied: Biber
02.11.2007 um 12:20 Uhr
Moin uteliggare,

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

Ich habe auch ein paar Zeilen daraus gemacht, damit es übersichtlich bleibt.
01.
::-------snipp ExtractMap.bat 
02.
@echo off & setlocal 
03.
for /f "delims="  %%i in ('findstr "map at " a.a') do call :findMap %%i 
04.
goto :eof 
05.
 
06.
:findmap 
07.
set ln=%* 
08.
Set ln=%ln: map =§% 
09.
Set ln=%ln: at =§% 
10.
For /f "delims=§ tokens=2" %%a in ("%ln%") do echo Map ist [%%a] 
11.
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.
01.
Map ist [de_chateau] 
02.
Map ist ["Berlin Alexanderplatz"]
P.S. Wenn es immer nur eine einzige Zeile bzw. Map sein kann, dann reicht natürlich:
01.
::-------snipp ExtractOneMap.bat 
02.
@echo off & setlocal 
03.
for /f "delims="  %%i in ('findstr "map at " a.a') do Set ln=%%i 
04.
Set ln=%ln: map =§% 
05.
Set ln=%ln: at =§% 
06.
For /f "delims=§ tokens=2" %%a in ("%ln%") do echo Map ist [%%a]
.... oder weniger...

Grüße
Biber
Bitte warten ..
Mitglied: uteliggare
02.11.2007 um 12:58 Uhr
Es funktioniert, es funktioniert! 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 Mit freundlichen Grüßen,
uti
Bitte warten ..
Mitglied: Biber
02.11.2007 um 19:48 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
PHP
gelöst HTML Dropdownmenü auslesen und in PHP als Variable übergeben (35)

Frage von ITFlori zum Thema PHP ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Google Android
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) (4)

Frage von lordzwieback zum Thema Google Android ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (29)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...