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

Bat... Knoteninhalt einer XML Datei laden?

Frage Entwicklung Batch & Shell

Mitglied: maccoX

maccoX (Level 1) - Jetzt verbinden

02.02.2011, aktualisiert 15:56 Uhr, 3967 Aufrufe, 15 Kommentare

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:
01.
@echo off 
02.
 
03.
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ data.xml') do @( 
04.
	for /L %%a in (8,8,8) do @if %%i==%%a @echo %%j 
05.
06.
 
07.
pause 
08.
 
... und hiermit könnte ich so eine Zeile (wird hier direkt als var angegeben) zurechtschneiden - zumindest irgendwie ...
01.
@echo off & setlocal 
02.
 
03.
set "Von=<id>" 
04.
set "Bis=</id>" 
05.
set G=%temp%\GetPart.vbs 
06.
>%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)) 
07.
 
08.
set "var=<id>010101</id>" 
09.
set varNeu=  
10.
for /f "delims=" %%i in ('cscript //nologo %G% "%var%" "%Von%" "%Bis%"') do set "varNeu=%%i"  
11.
if defined varNeu (echo %varNeu%) else (echo Teistring konnte nicht gebildet werden!) 
12.
 
13.
pause 
14.
 
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

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

Gruß, maccoX
Mitglied: 60730
02.02.2011 um 16:04 Uhr
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 - 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ß
Bitte warten ..
Mitglied: maccoX
02.02.2011 um 16:25 Uhr
Hallo,

Wow, danke für die superschnelle Antwort!

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

01.
@echo off & setlocal 
02.
 
03.
for /f "tokens=2 delims=<>" %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a 
04.
echo %tempo% 
05.
 
06.
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
Bitte warten ..
Mitglied: 60730
02.02.2011 um 16:46 Uhr
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
echo %tempi% ^|findstr /c:"%tempo%" && echo gefunden ||echo nicht gefunden
/edit
  • Damit "wird zuerst die erste zeile geechot und dann mittels find überprüft, ob das zutrifft "&&" oder nicht "||"

Gruß
Bitte warten ..
Mitglied: maccoX
02.02.2011 um 17:02 Uhr
Hallo nochmal ;)

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

01.
@echo off & setlocal 
02.
 
03.
for /f "tokens=2 delims=<>" %%a in ('more +7 data.xml') do if not defined tempo set tempo=%%a 
04.
echo %tempo% 
05.
 
06.
 
07.
for /f %%b in ('findstr "." doit.bat') do if not defined tempi set tempi=%%b 
08.
echo %tempi% ^|find "%tempo%" && echo gefunden ||echo nicht gefunden 
09.
 
10.
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ß
Bitte warten ..
Mitglied: 60730
02.02.2011 um 17:17 Uhr
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

  • Nimm bitte bis zur ZetaPhase das @echo off raus.
  • neue Zeile 7: echo %tempi% (just as a gimmick)
  • geänderte Zeile 08:
echo %tempi% ^|findstr /c: "%tempo%" && echo gefunden ||echo nicht gefunden

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

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
/edit
Bitte warten ..
Mitglied: bastla
02.02.2011 um 17:22 Uhr
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:
01.
set /p tempi=<doit.bat 
02.
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 ... [/Edit]

[Edit2] @T-Mo
schöner ist (wie so oft) dein Weg
Ist doch sowieso (wie auch in diesem Fall) zumeist nur "nachempfundener" Biber ...
[/Edit2]
Bitte warten ..
Mitglied: maccoX
02.02.2011 um 18:58 Uhr
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ß
Bitte warten ..
Mitglied: bastla
02.02.2011 um 19:06 Uhr
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
Bitte warten ..
Mitglied: maccoX
03.02.2011 um 09:56 Uhr
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ß
Bitte warten ..
Mitglied: bastla
03.02.2011 um 10:11 Uhr
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
Bitte warten ..
Mitglied: maccoX
03.02.2011 um 10:26 Uhr
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
Bitte warten ..
Mitglied: maccoX
05.02.2011 um 11:05 Uhr
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:
01.
for /f "tokens=2 delims=<> " %%a in ('more +1 data1.xml') do if not defined var1 set var1=%%a 
02.
for /f "tokens=2 delims=<> " %%a in ('more +1 data2.xml') do if not defined var2 set var2=%%a 
03.
echo Var1: %var1%  Var2: %var2% 
04.
 
05.
for /f "tokens=2 delims=<> " %%a in ('more +2 data1.xml') do if not defined var1 set var1=%%a 
06.
for /f "tokens=2 delims=<> " %%a in ('more +2 data2.xml') do if not defined var2 set var2=%%a 
07.
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ß
Bitte warten ..
Mitglied: bastla
05.02.2011 um 11:29 Uhr
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 ...

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
Bitte warten ..
Mitglied: maccoX
05.02.2011 um 12:01 Uhr
Hallo!

Danke, jetzt fluppt alles

Gruß maccoX
Bitte warten ..
Mitglied: 60730
05.02.2011 um 13:33 Uhr
Salü,

Zitat von maccoX:
Hallo!

Danke, jetzt fluppt alles
Danke für das Danke und das zweitschönste, das direkt hinter einem Danke steht ist - wenn wir das kurz und knackig gelöst haben und du was dazu gelernt hast .

Gruß maccoX

retour
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Xml-Datei laden bzw. auf Festplatte kopieren und per VBA in eine Access-Tabelle speichern (22)

Frage von machohunk zum Thema VB for Applications ...

XML
XML Datei Fehler? (1)

Frage von Patrick-IT zum Thema XML ...

Batch & Shell
Script zum XML Datei Umschreiben (12)

Frage von cberndt zum Thema Batch & Shell ...

PHP
gelöst Externe XML-Datei in PHP auslesen (18)

Frage von Akrosh zum Thema PHP ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...