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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
21 Kommentare
Neuester Kommentar
Hallo tommhii!
Soferne der Servername in einer eigenen Zeile so
in der Datei steht, sollte sich das ganze Vorhaben etwa so umsetzen lassen (ungetestet):
Grüße
bastla
[Edit] Suche nach "Servername" [Edit2] und Apostroph [/Edit2] ergänzt [/Edit]
Soferne der Servername in einer eigenen Zeile so
<Servername>DerServer</Servername>
@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
)
bastla
[Edit] Suche nach "Servername" [Edit2] und Apostroph [/Edit2] ergänzt [/Edit]
Hallo tommhii!
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:
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:
Grüße
bastla
hinter dem Dateinamen steht nicht der servername sondern ein anderer Wert.
Das Extrahieren des Servernamens erfolgt auf Basis der geposteten Beispielzeile<Servername>DerServer</Servername>
Um die Suche nach dem Tag genauer zu formulieren, könntest Du den Suchbegriff in Zeile 3 ergänzen:
set "Tag=set "Tag=^\<Servername\>"
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
bastla
Hallo tommhii!
Bau mal zwischen Zeile 9 und 10 ein
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
Bau mal zwischen Zeile 9 und 10 ein
echo "%%i"
findstr /i "Servername" "%%i"
findstr /i "\<Servername\>" "%%i"
echo ------------------------------------
Grüße
bastla
Hallo tommhii!
Falls Du nicht, wie empfohlen, direkt aus der CMD-Shell testest, füge noch unmittelbar vor Zeile 16
ein, damit Du die Ausgabe lesen kannst - mehr kann ich Dir, ohne Deine Dateien zu kennen, nicht anbieten ...
Grüße
bastla
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
Grüße
bastla