maccox
Goto Top

Bat... Knoteninhalt einer XML Datei laden?

Hallo,

das hier ist ein echt tolles Forum und besonders der Batch Bereich hat mir öfters weitergeholfen, jetzt brauche ich aber glaube ich aktive Hilfe :D

Es geht um folgendes:

ich habe eine XML Datei (data.xml), in der mehrere Knotenpunkte definiert sind. In der 8. Zeile ist der für mich wichtige Knoten <id>01</id> (immer eine zwei/dreistellige Zahl). Der Knotenpunkt ist normalerweise auch mit ein paar Lehrzeichen eingerückt, aber das könnte ich im Notfall entfernen, ansonsten muss der Aufbau der xml Datei so bleiben.

Jetzt würde ich mit der bat gerne diese eine Zahl (in dem Fall "01") einlesen und als Variable abspeichern. Weil ich hab eine weitere ausführliche bat Datei, die im Kopf eine oder mehrere id Werte hat (wie diese angegeben sind ist egal), und sollte dieser Wert da vorhanden sein, passt sie und muss ausgeführt werden, ansonsten eben nicht.

Was ich bisher habe:

Hiermit kann ich die komplette 8. Zeile auslesen:
@echo off

for /f "tokens=1,* delims=:" %%i in ('findstr /n $ data.xml') do @(  
	for /L %%a in (8,8,8) do @if %%i==%%a @echo %%j
)

pause
 

... und hiermit könnte ich so eine Zeile (wird hier direkt als var angegeben) zurechtschneiden - zumindest irgendwie ...
@echo off & setlocal

set "Von=<id>"  
set "Bis=</id>"  
set G=%temp%\GetPart.vbs
>%G% echo Set a=WScript.Arguments:T=a(0):Von=a(1):L=Len(Von):Bis=a(2):Start=InStr(T,Von):If Start^>0 Then Start=Start+L:Ende=InStr(Start,T,Bis)-Start:If Ende^>Start Then WScript.Echo Trim(Mid(T,Start,Ende))

set "var=<id>010101</id>"  
set varNeu= 
for /f "delims=" %%i in ('cscript //nologo %G% "%var%" "%Von%" "%Bis%"') do set "varNeu=%%i"   
if defined varNeu (echo %varNeu%) else (echo Teistring konnte nicht gebildet werden!)

pause
 

Das Problem ist aber, das 1. keine Leerzeichen vor dem <id> akzeptiert werden und zweites leider keine Zahl unter 6 Stellen möglich ist, denn dann bekomm ich leider kein Ergebnis - nur dumm das ich es für eine 2-3 stellige Zahl brauche face-sad

Wenn dann die 2-3 stellige id Zahl als Variable vorhanden ist müsste ich sie mit der ersten Zeile einer ausführen.bat Detei vergleichen. Diese könnte so aussehen: 01,02,05,120,23
Sollte einer dieser Zahlen gleich meiner Variablen sein, so soll die ausführen.bat ausgeführt werden. In Actionscript würde ich das mit var.indexof(zeile1) lösen, geht das in einer Batch ähnlich?

Ich hoffe Ihr könnt mir da etwas auf die Sprünge helfen, etwas batch versteh ich ja noch, aber das geht leider weit über meinen Horizont face-sad

Gruß, maccoX

Content-Key: 159979

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

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

Mitglied: 60730
60730 Feb 02, 2011 at 15:04:40 (UTC)
Goto Top
Moin,

vorab - merci für die Codeblöcke und den rest.

Dann eine Demo an der Dosbox im Ordner c:\script\xml

for /l %a in (1,1,12) do echo ^<id^>0%a^</id^>>>C:\script\xml\123.xml
  • Damit habe ich eine xml Datei zum spielen.
(Ich hab ehrlich keine Idee, was "(8,8,8)" im 1. Script an Zeile 4 bewirken soll face-wink - von 8 in 8er Schritten bis 8 hochzählen? - wozu dies?)

for /f "tokens=2 delims=<>" %a in ('more +7 C:\script\xml\123.xml') do if not defined tempo set tempo=%a
  • Damit hole ich mir aus der erzeugten Datei die Zeile 8 und werte alles zwischen >< aus.
  • mit
set %tempo%
  • erhalte ich (wie gewünscht) den Inhalt
08

Oder laufe ich grad über den falschen Abzweig nach Rom?

Gruß
Member: maccoX
maccoX Feb 02, 2011 at 15:25:05 (UTC)
Goto Top
Hallo,

Wow, danke für die superschnelle Antwort!

Also so funktioniert es jetzt bei mir - wirklich erstaunlich mit wie wenig Code - wow face-smile

@echo off & setlocal

for /f "tokens=2 delims=<>" %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a  
echo %tempo%

pause
Darf dabei dann zwar keine Leerzeilen vor <id> haben, da sonst "id" statt der Zahl ausgegeben wird, aber das ist jetzt nicht so wild, muss ich die XML halt "entformatieren".

DANKE! du hast es aber auch echt drauf.

Kannst du mir zufällig auch beim 2. Problem weiterhelfen?
Ich möchte von einer bat die erste Zeile einlesen, die mehrere solche 2-3 stelligen Zahlen hat und (und das ist der Knackpunkt) wenn eine davon die vorher aus der xml Datei gelesene %tempo% var ist, dann erst die andere bat ausführen.


Gruß maccoX
Mitglied: 60730
60730 Feb 02, 2011 at 15:46:25 (UTC)
Goto Top
Salü,
auch ein blindes Korn opfert sich mal einem Huhn - oder so ähnlich

  • grübel...

Wenn dann die 2-3 stellige id Zahl als Variable vorhanden ist müsste ich sie mit der ersten Zeile einer ausführen.bat Detei vergleichen. Diese könnte so aussehen: 01,02,05,120,23

naja -wenn mein Dampfer auf dem richtigen Fluss in die gewünschte Richtung rudert....

  • %tempo% wäre immer noch die Variable
  • und der übersichthalber nehmen wir den gleichen Weg - wie oben
for /f %b in ('findstr "." C:\script\xml\123.ini') do if not defined tempi set tempi=%b

  • damit hast du den kompletten Inhalt von der ersten Zeile
edit findstr ist besser
/edit
Gruß
Member: maccoX
maccoX Feb 02, 2011 at 16:02:46 (UTC)
Goto Top
Hallo nochmal ;)

Also ich glaub ich hab irgend etwas falsch gemacht, das ganze sieht jetzt so aus:

@echo off & setlocal

for /f "tokens=2 delims=<>" %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a  
echo %tempo%


for /f %%b in ('findstr "." doit.bat') do if not defined tempi set tempi=%%b  
echo %tempi% ^|find "%tempo%" && echo gefunden ||echo nicht gefunden  

pause

Allerdings bekomme ich leider immer ein "gefunden", auch wenn der Wert gar nicht vorhanden ist.
Achja, die erste Zeile der doit.bat sieht so aus: "01,02,05,120,23" - hab das oben einfach mal als Beispiel übernommen.


Gruß
Mitglied: 60730
60730 Feb 02, 2011 at 16:17:32 (UTC)
Goto Top
Zitat von @maccoX:
Hallo nochmal ;)

Also ich glaub ich hab irgend etwas falsch gemacht, das ganze sieht jetzt so aus:

Ich vermute ...der falschmacher sitzt nicht vor deiner Tastatur, das war schon meine face-wink


Zur Erklärung:
  • wenn 08 gesucht wird und von 01,02 usw "0" gesendet wird - findet "find" zwar nicht 08, aber die "0".
  • findstr /c: dagegen sucht gezielt nach "08" und gibt sich weder mit 0 noch 8 oder 80 zufrieden.

Denkfehler meinerseits.(Lag wohl daran, das ich gegrübelt habe warum in einer bat in der ersten Zeile Ziffern stehen könnten)

Gruß

edit

@ Bastla:
jau - das ^ ist zwar zuviel, aber ich habe heute ein paar Tüten Buchstabensuppe bekommen - und wußte nicht wohin mit den abgebrochenen "M"- oder waren das "W"? und da dachte ich - komm schadet nicht, fällt keinem auf face-wink

Und für das "set /p tempi=<" ich wollte es aus so aussehen lassen, als ob es aus einem Guß wäre - schöner ist (wie so oft) dein Weg face-wink
/edit
Member: bastla
bastla Feb 02, 2011 at 16:22:25 (UTC)
Goto Top
Hallo maccoX und willkommen im Forum, hallo T-Mo!

Da hat sich ein unnötiges "^" eingeschlichen - besser so:
echo %tempi% |find "%tempo%" && echo gefunden ||echo nicht gefunden
Außerdem wäre zu berücksichtigen, dass ev auch Teile einer Zahl gefunden werden - daher würde ich dafür sorgen, dass vor und nach jeder Zahl ein Komma steht - zusammen mit einer Alternative zum Einlesen der ersten Zeile etwa:
set /p tempi=<doit.bat
echo ,%tempi%,|findstr ",%tempo%,">nul && echo gefunden ||echo nicht gefunden  
Noch als Nachtrag zu:
... keine Leerzeichen vor dem <id> akzeptiert ...
Wenn auch das Leerzeichen als Delimiter verwendet wird, sollte doch auch diese Kuh vom Eis sein (innerhalb der gesuchten Zahl wird's ja wohl kein störendes Leerzeichen geben) ...

Grüße
bastla

[Edit] Was bin ich heute wieder flott ... face-confused [/Edit]

[Edit2] @t-mo
schöner ist (wie so oft) dein Weg face-wink
Ist doch sowieso (wie auch in diesem Fall) zumeist nur "nachempfundener" Biber ... face-wink
[/Edit2]
Member: maccoX
maccoX Feb 02, 2011 at 17:58:05 (UTC)
Goto Top
Abend!

Danke Leute!

Komme heute leider nicht mehr dazu es zu testen, wird morgen früh aber sofort nachgeholt.


@timobeil "(Lag wohl daran, das ich gegrübelt habe warum in einer bat in der ersten Zeile Ziffern stehen könnten)"
Ach ja, stimmt, das geht ja eh nicht, dann läuft die bat ja gar nicht richtig ab.

Muss dann wohl ein "::" oder "rem" davor setzen, sollte ja nicht stören da in der Zeile eh nur nach passenden Zahlen gesucht wird.

Ich probiers morgen dann mal aus, schon mal ein großes Danke an euch!

Gruß
Member: bastla
bastla Feb 02, 2011 at 18:06:53 (UTC)
Goto Top
Hallo maccoX!

Weshalb muss es denn die erste Zeile sein? Wenn Du zB eine Zeile
::DATA 01,02,05,120,23
irgendwo in der Batchdatei unterbringst, kann mit
for /f "tokens=2" %%i in ('findstr /b "::DATA" doit.bat') do set "tempi=%%i"
ja gezielt danach gesucht und der relevante Teil ausgelesen werden ...

Grüße
bastla
Member: maccoX
maccoX Feb 03, 2011 at 08:56:29 (UTC)
Goto Top
Morgen,

ich danke euch - funktioniert jetzt alles!

Die id Zahl aus der xml wird ausgelesen und mit denen der doit.bat verglichen. Wenn die Zahl existiert wird die doit.bat ausgeführt - super!


Das hier hab ich zwar nicht ganz verstanden wie ich so mein "<id>01</id>" in der xml per Leerzeichen einrücken kann ohne das es das Einlesen stört, aber ok. Hab zwar versucht das Leerzeichen bei "delims=<>" mit einzufügen, aber das wars nicht :D - ist aber auch zweitranging, hauptsache es funktioniert soweit!

Zitat von @bastla:
Noch als Nachtrag zu:
> ... keine Leerzeichen vor dem <id> akzeptiert ...
Wenn auch das Leerzeichen als Delimiter verwendet wird, sollte doch auch diese Kuh vom Eis sein (innerhalb der gesuchten Zahl
wird's ja wohl kein störendes Leerzeichen geben) ...

Gruß
Member: bastla
bastla Feb 03, 2011 at 09:11:23 (UTC)
Goto Top
Hallo maccoX!
Das hier hab ich zwar nicht ganz verstanden wie ich so mein "<id>01</id>" in der xml per Leerzeichen einrücken kann ohne das es das Einlesen stört
Gemeint war:
for /f "tokens=2 delims=<> " %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a
- und eigentlich sollte eine Zeile
    <id>12</id>
nur mit dem zusätzlichen Leerzeichen als "delimiter" richtig zerlegt werden - ohne sollte nicht "12", sondern "id" in der Variablen %tempo% landen (und tut's bei meinen Tests auch), da die führenden Leerzeichen so "token" Nummer 1 ergeben ...

Grüße
bastla
Member: maccoX
maccoX Feb 03, 2011 at 09:26:56 (UTC)
Goto Top
Hallo bastla,

... danke!! - so funktioniert es jetzt! - ich hatte bei meinem Versuch das Leerzeichen zwischen die <> Zeichen gesetzt und so gings nicht :D


Nochmals ein super Danke an euch beide, ihr habt mir damit echt mächtig geholfen - DANKE!!

Gruß, maccoX
Member: maccoX
maccoX Feb 05, 2011 at 10:05:48 (UTC)
Goto Top
Morgen,

ich hätte da jetzt noch eine kleine Zusatzfrage ...
Für was Ähnliches muss ich jetzt so einige XML Zeilen auslesen - aus 2 Dateien.

Das sieht jetzt so aus:
for /f "tokens=2 delims=<> " %%a in ('more +1 data1.xml') do if not defined var1 set var1=%%a  
for /f "tokens=2 delims=<> " %%a in ('more +1 data2.xml') do if not defined var2 set var2=%%a  
echo Var1: %var1%  Var2: %var2%

for /f "tokens=2 delims=<> " %%a in ('more +2 data1.xml') do if not defined var1 set var1=%%a  
for /f "tokens=2 delims=<> " %%a in ('more +2 data2.xml') do if not defined var2 set var2=%%a  
echo Var1: %var1%  Var2: %var2%

Nachdem var1 und 2 ausgelesen werden, werden sie entsprechend verarbeitet (hier nur mit Echo ausgegeben) und dann sollen eigentlich die neuen Werte (der nächsten Zeile der xml Dateien) in den Variablen landen. Genau das klappt aber leider nicht, ich bekomme beim 2. mal wieder das alte erste Ergebnis raus.

Hab zwar schon etwas mit den Variablen rumprobiert, kriegs aber irgendwie nicht raus. Dachte auch es liegt am " if not defined varx", aber wenn ich das rausnehme geht gar nichts mehr. Irgendwo hab ich da ein Denkfehler ...

Gruß
Member: bastla
bastla Feb 05, 2011 at 10:29:48 (UTC)
Goto Top
Hallo maccoX!
Dachte auch es liegt am " if not defined varx"
Tut es auch - es wird nur ein Wert in die Variable geschrieben, wenn sie noch keinen hat (= eigentlich noch gar nicht vorhanden ist) - damit wird verhindert, dass der Wert durch die nachfolgend eingelesenen Zeilen (die "for /f"-Schleife geht immer die gesamte Datei durch) überschrieben wird.
aber wenn ich das rausnehme geht gar nichts mehr
Grund: Siehe gleich oberhalb ... face-wink

Die Lösung ist aber ziemlich einfach: Damit die Variable wieder verwendbar wird, muss sie vorweg gelöscht werden - also:
set "var1="
Grüße
bastla
Member: maccoX
maccoX Feb 05, 2011 at 11:01:07 (UTC)
Goto Top
Hallo!

Danke, jetzt fluppt alles face-smile

Gruß maccoX
Mitglied: 60730
60730 Feb 05, 2011 at 12:33:35 (UTC)
Goto Top
Salü,

Zitat von @maccoX:
Hallo!

Danke, jetzt fluppt alles face-smile
Danke für das Danke und das zweitschönste, das direkt hinter einem Danke steht ist - wenn wir das kurz und knackig How can I mark a post as solved? haben und du was dazu gelernt hast face-wink.

Gruß maccoX

retour
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 CommentsAlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 CommentsDaniEnd of Support dates for Office 2016, 2019 Apps und Productivity ServersDani - 1 Comment