driver78
Goto Top

Wie finde ich folgende Werte?

Ich suche eine Möglichkeit in einer erstellten Text Datei Zwei Werte auszulesen. Der eine Wert kann ich über Find finden, jedoch ist der zweite Wert eine Variable innerhalber der Text Datei!

Guten Abend zusammen,

ich muss gestehen ich bin ein relativer Neuling was die Batch Programmierung anbelangt.
Und ich besitze keinerlei Programmierkenntnisse, alles das was ich kann habe ich mir erlesen und ausprobiert. Doch nun komme ich an einen Punkt, da weiß ich nicht weiter.
Ich habe eine Text Datei, in der viele verschiedene Werte stehen, für mich sich aber nur 5 Werte Relevant, wobei zwei als UND Verknüpft werden sollen!

Beispiel:

Die Text Datei enthält folgende Daten:

map*: Suez_Canal 	  	
*game (version):* 	stella (1.10.48.0)
*punkbuster:* 	no
*passworded:* 	no
*maxplayers:* 	48
*players:* 	33
*team:* 2
*deaths:* 0
*pid:* 276696252
*skill:* 0
*team:* 2
*deaths:* 0
*pid:* 276697571
*skill:* 0

usw.

für mich sind nun folgende Werte Wichtig! Einmal die PID die ich mit FIND abfrage! Und die Anzahl der Players, die sich jedoch immer wieder ändert!
Und ich möchte nun folgendes.

Wenn die Pid UND die Anzahl der Players über 20 ist goto Wait

Für den Suche nach der Pid gehe ich wie folgt vor:

find /c /i "276696252" "C:\temp\wget\check.txt"  
IF ERRORLEVEL 1 goto StartAcht
IF ERRORLEVEL 0 goto CheckB

Erstmal vielen Dank für die Hilfe und für die Nachsicht.........doch jeder fängt mal klein an! face-smile

Content-Key: 156995

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

Printed on: April 23, 2024 at 07:04 o'clock

Member: bastla
bastla Dec 14, 2010 at 20:16:04 (UTC)
Goto Top
Hallo Driver78 und willkommen im Forum!

Du kannst die Anzahl der Player etwa so ermitteln und zwischenspeichern:
for /f "tokens=2" %%i in ('findstr /b "*players:*" "C:\temp\wget\check.txt"') do set "players=%%i"
Sollte es allerdings mehrere Zeilen der Art
*players:* ##
geben, würdest Du in der Variablen %players% den Wert aus der letzten gefundenen Zeile erhalten.

Wenn die Auswertung mit find /c /i "276696252" "C:\temp\wget\check.txt" für Dich funktioniert (eigentlich wird damit die Anzahl der Zeilen mit enthaltenem (Teil)-String "276696252" ermittelt), ließe sich die Kombination etwa so erstellen:
find /c /i "276696252" "C:\temp\wget\check.txt">nul && if %players% gtr 20 goto :Wait
Die Verknüpfung mit "&&" entspricht dabei einer Abfrage des Errorlevels auf 0 ...

Grüße
bastla
Mitglied: 60730
60730 Dec 14, 2010 at 20:17:04 (UTC)
Goto Top
moin,

  • ich verstehe aber nicht, warum du nach "276696252" suchst, wenn du eh weißt, dass das die pid ist?
  • warum suchst du nicht nach pid?

Demo zum spielen und lernen...

for /f "tokens=2 delims=*" %a in ('find "players" C:\pfad\text.txt') do echo %a
for /f "tokens=2 delims=*" %a in ('find "xplayers" C:\pfad\text.txt') do echo %a
for /f "tokens=2 delims=*" %a in ('find "*players" C:\pfad\text.txt') do echo %a


  • statt do echo, kann man auch den Befehl do set nehmen
  • mit set /a kann man auch gleich größer und oder kleiner auswerten

Set /?
For /?

Gruß
Member: Driver78
Driver78 Dec 14, 2010 at 21:17:03 (UTC)
Goto Top
Erstmal vielen Dank für eure Bemühungen.

find /c /i "276696252" "C:\temp\wget\check.txt">nul && if %players% gtr 20 goto :Wait  

Bedeutet doch, das er in der check.txt den Wert "276696252" sucht und wenn der wert über 20 ist soll er auf :Wait gehen.
Jedoch fehlt mir dann aber noch die Alternative, wenn nicht gehe zu einem anderen Punkt!
Member: bastla
bastla Dec 14, 2010 at 21:28:35 (UTC)
Goto Top
Hallo Driver78!

Wie soll denn die genaue Vorgangsweise sein (oben war ja nur die Rede von "Wenn die Pid UND die Anzahl der Players über 20 ist goto Wait")?

Grundsätzlich würde es ja genügen, in die nächste Zeile die alternative Vorgangsweise zu schreiben - wenn nicht gesprungen wurde, wird ja diese nächste Zeile ausgeführt ...

Ansonsten kannst Du das (ungetestet) auch etwa so aufbauen:
find /c /i "276696252" "C:\temp\wget\check.txt">nul && (if %players% gtr 20 (goto :Wait) else (goto :AndererPunkt)) || (echo PID nicht gefunden! & goto :eof)

Besser lesbar ginge das Ganze auch so:
find /c /i "276696252" "C:\temp\wget\check.txt">nul && (  
    if %players% gtr 20 (
        goto :Wait
    ) else (
        goto :AndererPunkt
    )
) || (
    echo PID nicht gefunden!
    goto :eof
)
Grüße
bastla
Member: Driver78
Driver78 Dec 15, 2010, updated at Mar 29, 2023 at 23:36:14 (UTC)
Goto Top
Ich muss mich Entschuldigen, einmal dafür das ich einwenig zu forsch war, weil ich zu Unüberlegt gepostet habe.
Und zweitens, weil ich euch damit nur unnötig Verwirrt habe. Doch ehrlich gesagt, in meinem Kopf Kreisen zur Zeit tausend Befehle Gedanken und Dinge. Und ich beneide jeden einzelnen, der bei den ganzen Codes, Parameter und Befehlen, noch den Überblick behält!
Doch nun weiter........

In meiner checkt.txt werden die Werte anders Angezeigt wie zu Eingangs gepostet. Es lag daran das ich einen anderen Viewer benutzt habe und es mir nicht aufgefallen ist.
Hier einmal für diejenigen die mehr wie ein Auge zu Drücken können! ^^

<td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" ><strong>Spieleranzahl:</strong></font></td>  
<td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" >##red|19,##</font></td></strong> 1<br><strong>pid:</strong> ##red|287421623,##<br><strong>skill:</strong> 1<br>')">  

Dieses ist jetzt nur ein kleiner Teil des gesammten Datei, jedoch genügt dieses um diesmal Richtig aufzuzeigen was ich denn überhaupt möchte.

Vorweg, ich habe in der entsprechenden PHP den Eintrag Players: umbenannt in Spieleranzahl:, damit es da keine Verwechslung seitens der Suche gibt wegen MaxPlayers:.

Jedoch geht es darum das ich es nicht schaffe, die Spieleranzahl heraus zu finden. Weil diese hinter den ganzen anderen Werten irgendwie nicht zu finden ist. Wenigstens für mich............! Ich möchte hingehen können und mit der Batch folgendes realiesieren:

Wenn die Spieleranzahl größer ist wie 20 und die PID vorhanden gehe zu :beendeprozess
Wenn die Spieleranzahl größer ist wie 20 und die PID nicht vorhanden gehe zu :checkeweiter
Wenn die Spieleranzahl unter 20 ist, aber die PID vorhanden gehe zu :checkeweiter
Wenn die Spieleranzahl unter 20 ist, aber die PID nicht vorhanden mache :starteprozess

Ich hoffe ich konnte wenigstens jetzt einwenig Klarheit schaffen. Und hoffe immer noch darauf das mein Vorhaben funktioniert.

Und damit ich irgendwann selber mal verstehe was die einzelnen Werte, Befehle usw. Bedeuten, wäre ein Buch Ratschlag am Rande wohl nicht verkehrt. Wie gesagt, dieses ist das erste mal das ich ein solche Batch in dem Umfang benutze. Und mir fällt es Sichtlich schwer, vor allem da ich nicht wirklich Beruflich damit zu tun habe, und zweifelsohne ein Laie bin.

In dem Sinn,
vielen vielen Dank für Ihre Unterstützung, die wahrlich nicht Selbstverständlich ist.
Mitglied: 60730
60730 Dec 15, 2010 at 08:05:39 (UTC)
Goto Top
Moin,

schade - dass du dir meine wenigen Zeilen nicht durchgelesen oder die markierten probiert hast....

  • Die erste Zeile würde beide Werte finden?
  • die zweite welchen der beiden?
  • und die dritte dann evtl. den anderen?

Oder andersherum ist vor Players ein x oder vor maxplayers ein *? eben

Und wenn diese Token und Delims für deine erste Frage 2 bzw * sind - welches Trennzeichen (delims) würdest du jetzt nehmen?
Wäre da <> nicht ein guter Ansatz?
Die Stelle (Token) - wo der Wert gefunden wird - kannst du ja selber anhand des Beispiels und deiner kompletten html Datei herausfinden.

Gruß
Member: bastla
bastla Dec 15, 2010 at 10:06:42 (UTC)
Goto Top
Hallo Driver78!

Sind die Zeilen
<td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" ><strong>Spieleranzahl:</strong></font></td>  
<td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" >19,</font></td>  
</strong> 1<br><strong>pid:</strong> 287421623,<br><strong>skill:</strong> 1<br>')">  
tatsächlich (inkl Zeilenschaltungen) so richtig dargestellt (BTW: ein typischer Fall, in dem zur Verwendung der ""-Formatierung zu raten ist)?

Falls ja wird das Ganze per Batch ziemlich mühsam: abgesehen von den (Batch-)Sonderzeichen "<" und ">" (die bei Anwendung der von TimoBeil vorgeschlagenen Vorgangsweise noch relativ gut in den Griff zu bekommen sind) und der Tatsache, dass relevante Informationen auf mehrere Zeilen verteilt sind, verursacht eine ungerade Anzahl von Anführungszeichen oder Apostrophen in einer einzelnen Zeile der Quelldatei (und Batch kann nur zeilenweise verarbeiten) größere Schwierigkeiten - es würde sich daher eher eine andere Sprache (zB VBS) anbieten (ich komm' nur leider gerade nicht dazu, etwas zu basteln) ...

Grüße
bastla
Member: Driver78
Driver78 Dec 15, 2010 at 10:48:46 (UTC)
Goto Top
Guten Tag,

Nun, zu dem Vorschlag von TimoBeil muss ich sagen, das dieses eine Nummer zu hoch für mich ist, selbst das Tutorial verwirrt mich zuzeit mehr als das es mir hilft, wenn gleich dieses auch die Perfekte Lösung wäre. Ich habe in den letzten zwei Stunden versucht mit den gennanten Befehlen zu Arbeiten, jedoch ohne Sichtbaren erfolgt.
Mein Problem ist, das ich es nicht so testen kann, das ich ein Ergebniss sehe und ich dann den "erlösenden" Aha Effekt erziele.

Von daher wäre vielleicht eine kleine Beispiel Lektion mit Sicherheit Lehrreicher!

Anbei mal der Code, diesmal auch in der "Code" Formatierung (die vorherigen Zeilen des Codes lasse ich mal Weg)

                    <td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" ><strong>maxplayers:</strong></font></td>  
                    <td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" >48</font></td>  
                  </tr>
                  <tr class="borderAround">  
                    <td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" ><strong>Spieleranzahl:</strong></font></td>  
                    <td width="50%" align="left" nowrap class="secondTableColor"><font class="smallFont" >19</font></td>  

Gruß
Member: bastla
bastla Dec 15, 2010 at 15:42:28 (UTC)
Goto Top
Hallo Driver78!

Mit den dargestellten Daten sollte sich das dann doch noch per Batch realisieren lassen:
@echo off & setlocal
set "Check=C:\temp\wget\check.txt"  
set "PID=287421623"  

set "ZNr="  
for /f "delims=:" %%i in ('findstr /n "Spieleranzahl:" "%Check%"') do set "ZNr=%%i"  
if not defined ZNr echo Spieleranzahl nicht gefunden & goto :eof
set /a ZNr+=1
for /f "tokens=4 delims=<>" %%i in ('findstr /n "^" "%Check%"^|findstr /b "%ZNr%:"') do set "players=%%i"  
findstr "%PID%" "%Check%">nul && (  
    if %players% gtr 20 (
        goto :beendeprozess
    ) else (
        goto :checkeweiter
    )
) || (
    if %players% gtr 20 (
        goto :checkeweiter
    ) else (
        goto :starteprozess
    )
)
Grüße
bastla
Member: Driver78
Driver78 Dec 15, 2010 at 18:29:26 (UTC)
Goto Top
Vielen Vielen Dank bastla,

ich kann Dir nicht genug danken, es funktioniert! Zwar verstehe ich nur einen Bruchteil der Befehle die dort verarbeitet sind, doch ich werde mich bemühen dahinter zusteigen!

Gruß
Member: bastla
bastla Dec 15, 2010 at 22:17:58 (UTC)
Goto Top
Hallo Drive78!

Freut mich, wenn's klappt ... face-smile

... und bei Fragen: fragen face-wink

Grüße
bastla