tommhii
Goto Top

Aus Konfigurations Dateien eine Zeichenfolge auslesen und hinter den Dateinamen schreiben

mit einer find Abfrage lese ich aus vielen XML Konfigurations Dateien eine Versionsnummer aus wenn diese vorhanden ist soll der Dateiname in eine Datei geschrieben werden, aus den Dateien die jetzt in der ergebnis.log stehen möchte ich als info für mich den Servernamen hinter den Dateinamen schreiben um zu wissen welcher server die gleiche Versionsnummer hat , alles soll dann wieder in eine Datei geschrieben werden.

Folgendes Problem beschäftigt mich , es wäre schön wenn mir jemand einen tip geben könnte.
Ich habe in einen Ordner ca 10 xml Dateien aus denen lese ich eine bestimmte zeichenfolge aus. Wenn die Datei diese Zeichenfolge (25 , 30 ,10) enthält setze ich eine 1 an den Dateinamen und schreibe den Dateinamen in eine Datei


 Find /C "25 , 30 ,10" *.xml | Find "XML: 1" > ergebnis.log > >  

soweit klappt das ja, aber nun möchte ich von allen Dateien die in die ergebnis.log geschrieben wurden die Zeichenfolge "Servername" auslesen und den ausgelesenen Servername an den Dateinamen anhängen.
die Ausgabe sollte dann so in etwa aussehen

7238459.xml servername
4348940.xml servername

in jeder xml Datei steht ein anderer Servername. Der Servername der aus der xml Datei ausgelesen wurde sollte auch hinter dem richtigen Dateinamen stehen. Ich möchte automatisiert aus der Datei ergebnis.log
die einzelnen Dateien ansprechen die dort stehen.
wie kann man das machen? und den Wert der Abfrage hinter den Dateinamen in der Liste (ergebnis.log) schreibt.


VG
tommhi

Content-ID: 188437

Url: https://administrator.de/forum/aus-konfigurations-dateien-eine-zeichenfolge-auslesen-und-hinter-den-dateinamen-schreiben-188437.html

Ausgedruckt am: 23.12.2024 um 13:12 Uhr

bastla
bastla 22.07.2012, aktualisiert am 23.07.2012 um 12:04:24 Uhr
Goto Top
Hallo tommhii!

Soferne der Servername in einer eigenen Zeile so
<Servername>DerServer</Servername>
in der Datei steht, sollte sich das ganze Vorhaben etwa so umsetzen lassen (ungetestet):
@echo off & setlocal
set "Version=25 , 30 ,10"  
set "Tag=Servername"  
set "Log=ergebnis.log"  

del "%Log%" 2>nul  
for /f "delims=" %%i in ('findstr /mc:"%Version%" *.xml') do (  
    for /f "tokens=2 delims=<>" %%a in ('findstr /i "%Tag%" "%%i"') do >>"%Log%" echo %%i %%a  
)
Grüße
bastla

[Edit] Suche nach "Servername" [Edit2] und Apostroph [/Edit2] ergänzt [/Edit]
tommhii
tommhii 23.07.2012 um 07:30:44 Uhr
Goto Top
Hallo bastla,

ja die Zeile Servername steht so in der Datei. Wo fragst du aber in dem Script nach dem Servernamen, in der Datei stehen natürlich noch andere Werte drin wie Version und Servername.

VG
tommhi
bastla
bastla 23.07.2012 um 08:27:35 Uhr
Goto Top
Hallo tommhii!

Sorry - hatte ich gestern nur so zwischen Tür und Angel hingeschrieben - ist jetzt aber oben dabei ...

Grüße
bastla
tommhii
tommhii 23.07.2012 aktualisiert um 11:09:28 Uhr
Goto Top
Hallo bastla,

ich hab es mal getestet, aber es wird keine log Datei geschrieben und es kommt auch keine Fehler Meldung.


<Servername>DerServer</Servername>
<Version>dieVersion</Version>
<Hersteller>derHersteller</Hersteller>
> 

Das sind jetzt nur 3 Einträge aus so einer xml Datei, aber nicht alle. Bis zu ca. 40 Einträge befinden sich in so einer xml -Datei die durchsucht werden soll.

VG
tommhi
bastla
bastla 23.07.2012 um 12:03:48 Uhr
Goto Top
Hallo tommhii!

Ich habe jetzt noch das (hoffentlich) letzte fehlende Teilchen ("'") oben ergänzt ...

Grüße
bastla
tommhii
tommhii 23.07.2012 um 13:00:25 Uhr
Goto Top
Hallo bastla,

immernoch keine Reaktion von dem Script ,es entsteht immernoch keine .log .

VG
tommhi
bastla
bastla 23.07.2012 aktualisiert um 13:59:36 Uhr
Goto Top
Hallo tommhii!

Dann stell mal auf "echo on" und schau Dir den Ablauf an bzw, einfacher, teste mal vorweg
findstr /mc:"25 , 30 ,10" *.xml
Grüße
bastla
tommhii
tommhii 23.07.2012 um 15:12:47 Uhr
Goto Top
komma war bei der Version an der falschen Stelle. Die ergebnis.log wird jetzt erstellt aber hinter dem Dateinamen steht nicht der servername sondern ein anderer Wert.


84087103058740391342603454333.xml /Sig

VG
tommhi
bastla
bastla 23.07.2012 aktualisiert um 15:40:00 Uhr
Goto Top
Hallo tommhii!
hinter dem Dateinamen steht nicht der servername sondern ein anderer Wert.
Das Extrahieren des Servernamens erfolgt auf Basis der geposteten Beispielzeile
<Servername>DerServer</Servername>
indem anhand der Tennzeichen "<" und ">" das zweite entstehende Token "DerServer" gebildet wird - wenn die Zeile anders aussieht (inkl zB Leerzeichen am Zeilenanfang), kann die Zerlegung nicht funktionieren.

Um die Suche nach dem Tag genauer zu formulieren, könntest Du den Suchbegriff in Zeile 3 ergänzen:
set "Tag=set "Tag=^\<Servername\>"
Damit werden dann genau jene Zeilen gefunden, an deren Anfang "<Servername>" steht.

Eine etwas robustere Version (hier muss "<Servername>" nicht am Zeilenanfang stehen) könnte dann noch so aussehen:
@echo off & setlocal
set "Version=25 , 30 , 10"  
set "Tag=<Servername>"  
set "Log=ergebnis.log"  

set "Suche=%Tag:<=\<%"  
set "Suche=%Suche:>=\>%"  
del "%Log%" 2>nul  
for /f "delims=" %%i in ('findstr /mc:"%Version%" *.xml') do (  
    for /f "delims=" %%a in ('findstr /i "%Suche%" "%%i"') do set "Zeile=%%a" & call :ProcessLine "%%i"  
)
goto :eof

:ProcessLine
for /f "tokens=2 delims=<>" %%s in ("%Zeile:*%Tag%=%") do >>"%Log%" echo %~1 %%s  
goto :eof
Grüße
bastla
tommhii
tommhii 30.07.2012 um 09:40:33 Uhr
Goto Top
hallo bastla,

sorry ich kann mich erst jetzt melden war eine woche nicht da. Danke erstmal für deine Mühe.
Leider geht es auch so nicht. Mit diesen Script werden nur noch 6 xml Dateinamen in das log geschrieben vorher waren es 56 . und so sieht das ergebnis aus :
53898011342591595702.xml /Sig woher das /Sig kommt weiss ich nicht. eigentlich sollte da der Servername stehen.

VG
Tommhii
bastla
bastla 30.07.2012 um 11:28:34 Uhr
Goto Top
Hallo tommhii!

Ersetze das Unterprogramm ab Zeile 14 durch
:ProcessLine
call set "Zeile=%%Zeile:*%Tag%=%%"  
for /f "delims=<>" %%s in ("%Zeile%") do >>"%Log%" echo %~1 %%s  
goto :eof
Grüße
bastla
tommhii
tommhii 30.07.2012 aktualisiert um 13:19:38 Uhr
Goto Top
Hallo bastla,

das mit dem Servernamen passt jetzt, aber warum findet er nur 6 Dateinamen, wo er doch mit dem vorgehenden Script 56 gefunden hat.


VG
tommhi
bastla
bastla 30.07.2012 aktualisiert um 15:36:46 Uhr
Goto Top
Hallo tommhii!

Bau mal zwischen Zeile 9 und 10 ein
echo "%%i"  
findstr /i "Servername" "%%i"  
findstr /i "\<Servername\>" "%%i"  
echo ------------------------------------
und starte den Batch aus der CMD-Shell - es werden jetzt für alle Dateien, die die richtige Versionsnummer enthalten, die Zeilen mit "Servername" bzw mit "<Servername>" angezeigt - daraus solltest Du dann Rückschlüsse ziehen könen ...

Grüße
bastla
tommhii
tommhii 30.07.2012 um 16:37:43 Uhr
Goto Top
hallo bastla,

ich hab das eingefügt vor dem 1. goto :eof, aber in der log Datei stehen wieder nur die 6 Dateinamen . So sieht es ja gut aus aber es müssten laut der Version 56 Dateien sein.

VG
tommhi
bastla
bastla 30.07.2012 um 17:07:07 Uhr
Goto Top
Hallo tommhii!
ich hab das eingefügt vor dem 1. goto :eof
Da anscheinend
zwischen Zeile 9 und 10
nicht verständlich genug war: Füge die genannten Zeilen vor der Zeile mit der einzelnen Klammer, die vor dem ersten "goto :eof" steht, ein ...

Grüße
bastla
tommhii
tommhii 31.07.2012 aktualisiert um 07:58:33 Uhr
Goto Top
Hallo bastla,

ich habe es so eingefügt aber das Ergebnis bleibt das gleiche.
 @echo off & setlocal
set "Version=25, 30, 10"  
set "Tag=<Servername>"  
set "Log=ergebnis.log"  
set "Suche=%Tag:<=\<%"  
set "Suche=%Suche:>=\>%"  
del "%Log%" 2>nul  
for /f "delims=" %%i in ('findstr /mc:"%Version%" *.xml') do (  
    for /f "delims=" %%a in ('findstr /i "%Suche%" "%%i"') do set "Zeile=%%a" & call   
:ProcessLine "%%i" 
echo "%%i"  
findstr /i "Servername" "%%i"  
findstr /i "\<Servername\>" "%%i"  
echo ------------------------------------
)
goto :eof
:ProcessLine
call set "Zeile=%%Zeile:*%Tag%=%%"  
for /f "delims=<>" %%s in ("%Zeile%") do >>"%Log%" echo %~1 %%s  
goto :eof

VG
tommhi
bastla
bastla 31.07.2012 um 11:12:42 Uhr
Goto Top
Hallo tommhii!
aber das Ergebnis bleibt das gleiche.
Falls Du damit den Inhalt der "ergebnis.log" meinst, kann das ja auch nicht anders sein - es wird ja nur ausgegeben, was mit den jeweiligen Suchvarianten gefunden wird, damit Du anhand dieser Ausgabe Rückschlüsse ziehen kannst; wie schon erwähnt liefert die Zeile 12 alle Zeilen, in denen "Servername" enthalten ist, und die Zeile 13 (stärker einschränkend) nur Zeilen, in denen "<Servername>" steht ...

Falls Du nicht, wie empfohlen, direkt aus der CMD-Shell testest, füge noch unmittelbar vor Zeile 16
pause
ein, damit Du die Ausgabe lesen kannst - mehr kann ich Dir, ohne Deine Dateien zu kennen, nicht anbieten ...

Grüße
bastla
tommhii
tommhii 31.07.2012 um 12:01:23 Uhr
Goto Top
Hallo bastla,

in dem Ordner wo sämtliche xml Dateien stehen habe ich eine Suche mit diesem Script gemacht dann bekomm ich 56 Einträge in die Ergebnis.log
@echo off & setlocal
> set "Version=25 , 30 ,10"  
> set "Tag=Servername"  
> set "Log=ergebnis.log"  
> 
> del "%Log%" 2>nul  
> for /f "delims=" %%i in ('findstr /mc:"%Version%" *.xml') do (  
>     for /f "tokens=2 delims=<>" %%a in ('findstr /i "%Tag%" "%%i"') do  
> >>"%Log%" echo %%i %%a  
> )
> 


Nehme ich das letzte Script dann erhalte ich nur 6 Einträge in der Ergebnis.log. Im ersten Script hat er nur den Servernamen nicht angehangen an den Dateinamen. Also kann es doch nicht an der Suchvariante liegen.

Die Suche nach der Version ist doch in jedem Script gleich.

VG
tommhi
bastla
bastla 31.07.2012 um 12:16:07 Uhr
Goto Top
Hallo tommhii!
Die Suche nach der Version ist doch in jedem Script gleich.
Wenn Du meinst ...

Dann passe einfach dieses Script an und gut ist.

Grüße
bastla
tommhii
tommhii 31.07.2012 um 13:34:38 Uhr
Goto Top
Hallo bastla!

ich hab mal eine pause zwischen zeile 11 und 12 also nach dem
 echo "%%i"  

eingefügt und da lese ich folgendes :
Die Datei "er>♣? " kann nicht gefunden werden
"4567399923636373.xml"
Drücken Sie eine beliebige Taste...

liegt das vielleicht an dem 3. Set.
er hört immer nach den ersten 13 Dateien auf und schreibt die ersten 6 gefundenen Dateinamen in die ergebnis.log. warum hört er na 13 Dateien auf, obwohl da noch einige mehr stehen.

VG
Tommhi
bastla
bastla 31.07.2012 um 14:53:25 Uhr
Goto Top
Hallo tommhii!
warum hört er na 13 Dateien auf, obwohl da noch einige mehr stehen.
Wie schon gesagt: Da ich Deine Dateien nicht kenne, kann ich Dir diese Frage auch nicht beantworten - die Besonderheiten der Datei 14 musst Du selbst herausfinden ...

Grüße
bastla