XML Datei per Inhalt umbenennen
Hallo,
Zur Archivierung unserer Abgasuntersuchungen wollte ich mir ne kleine Batch Datei basteln...
Die Übergabe der Daten erfolgt auf einer 3,5Zoll Diskette. Dort liegt z. B. diese
Beispiel XML Datei
ich möchte den Dateinamen durch Inhalte dieser XML ändern...
und zwar
1. <REGISTRATION>
und weil dieser Dateiname auch mehrmals vorkommen kann
2. <START_TEST>
Mein Traum sieht also (für die Beispiel XML) etwa so aus
WN-PT 101_01.12.2012 10:21.xml
Den Code den ich hier bisher fand
ist leider nicht zielführend, der Inhalt von <REGISTRATION> wird erst bei "Tokens=17 bewertet...
an <START_TEST> komme ich so gar nicht ran, bei Tokens=31 ist Schluss!??
Der gesamte Ablauf der Archivierung würde (für mich) wenn die Umbenennung funktioniert wie folgt aussehen...
1. Diskette stecken und Archiv.Bat aufrufen
2. Archiv.Bat ruft das QS Programm auf und wartet bis dieses beendet ist (... wait) (das Programm ändert die Dateiendung nach einlesen in BAK)
3. Diskette auf Festplatte (Hilfsordner??) verschieben (move)
4. BAK in XML zurückschreiben
5. Dateinamen "logisch" umbenennen
6. alle Dateien in Archivordner verschieben...
1-4 und 6 bekomme ich hin nur an 5. scheitere ich.
Für die Hilfe bedanke ich mich im Voraus
Gruß Jens
Zur Archivierung unserer Abgasuntersuchungen wollte ich mir ne kleine Batch Datei basteln...
Die Übergabe der Daten erfolgt auf einer 3,5Zoll Diskette. Dort liegt z. B. diese
Beispiel XML Datei
ich möchte den Dateinamen durch Inhalte dieser XML ändern...
und zwar
1. <REGISTRATION>
und weil dieser Dateiname auch mehrmals vorkommen kann
2. <START_TEST>
Mein Traum sieht also (für die Beispiel XML) etwa so aus
WN-PT 101_01.12.2012 10:21.xml
Den Code den ich hier bisher fand
:ProcessFile
set "Titel=" & set "Episode="
for /f "tokens=3 delims=<>" %%t in ('findstr /i "<title>" %1^|findstr /iv "<title></title>"') do set "Titel=%%t"
for /f "tokens=3 delims=<>" %%e in ('findstr /i "<episode_number>" %1^|findstr /iv "<episode_number></episode_number>"') do set "Episode=%%e"
set "NameNeu=%~n1"
if defined Titel set "NameNeu=%NameNeu%_%Titel%"
if defined Episode set "NameNeu=%NameNeu%_%Episode%"
echo ren %1 "%NameNeu%%~x1"
goto :eof
ist leider nicht zielführend, der Inhalt von <REGISTRATION> wird erst bei "Tokens=17 bewertet...
an <START_TEST> komme ich so gar nicht ran, bei Tokens=31 ist Schluss!??
Der gesamte Ablauf der Archivierung würde (für mich) wenn die Umbenennung funktioniert wie folgt aussehen...
1. Diskette stecken und Archiv.Bat aufrufen
2. Archiv.Bat ruft das QS Programm auf und wartet bis dieses beendet ist (... wait) (das Programm ändert die Dateiendung nach einlesen in BAK)
3. Diskette auf Festplatte (Hilfsordner??) verschieben (move)
4. BAK in XML zurückschreiben
5. Dateinamen "logisch" umbenennen
6. alle Dateien in Archivordner verschieben...
1-4 und 6 bekomme ich hin nur an 5. scheitere ich.
Für die Hilfe bedanke ich mich im Voraus
Gruß Jens
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 205452
Url: https://administrator.de/forum/xml-datei-per-inhalt-umbenennen-205452.html
Ausgedruckt am: 22.04.2025 um 16:04 Uhr
10 Kommentare
Neuester Kommentar
Hallo,
Doppelpunkte sind nicht im Dateinamen erlaubt, habe ich durch Punkt ersetzt.
Den Dateinamen fügst du als "xmlfile" ein. Und auf die zwei Leerzeilen achten, sonst geht's nicht.
Viel Spass noch und Gruss!
Doppelpunkte sind nicht im Dateinamen erlaubt, habe ich durch Punkt ersetzt.
@echo off &setlocal
set "xmlfile=19134803.XML"
set LF=^
REM die beiden Zeilen über dieser MÜSSEN frei und leer bleiben !!
for /f "usebackqdelims=" %%i in ("%xmlfile%") do set "xmlline=%%i"
setlocal enabledelayedexpansion
set "xmlline=%xmlline:><=>!LF!<%"
for /f "tokens=1,2delims=<>" %%i in ("!xmlline!")do (
if "%%i" equ "REGISTRATION" set "REGISTRATION=%%j"
if "%%i" equ "START_TEST" set "START_TEST=%%j"
)
set "START_TEST=%START_TEST::=.%
set "newxml=%REGISTRATION%_%START_TEST%.xml"
ren "%xmlfile%" "%newxml%"
endlocal
Viel Spass noch und Gruss!
Hallo,
eine Forschleife mehr und ein paar Fehlerprüfungen:
Gruss!
eine Forschleife mehr und ein paar Fehlerprüfungen:
@echo off &setlocal
set "xmlfile="
set LF=^
REM die beiden Zeilen über dieser MÜSSEN frei und leer bleiben !!
for /f "delims=" %%i in ('dir /b /a-d *.xml ^|sort /r') do set "xmlfile=%%~i"&call:process
goto:eof
:process
for /f "usebackqdelims=" %%i in ("%xmlfile%") do set "xmlline=%%i"
setlocal enabledelayedexpansion
set "xmlline=%xmlline:><=>!LF!<%"
for /f "tokens=1,2delims=<>" %%i in ("!xmlline!")do (
if "%%i" equ "REGISTRATION" set "REGISTRATION=%%j"
if "%%i" equ "START_TEST" set "START_TEST=%%j"
)
if not defined REGISTRATION echo "%xmlfile%": REGISTRATION nicht gefunden.&goto:eof
if not defined START_TEST echo "%xmlfile%": START_TEST nicht gefunden.&goto:eof
set "START_TEST=%START_TEST::=.%"
set "newxml=%REGISTRATION%_%START_TEST%.xml"
if not exist "%newxml%" (ren "%xmlfile%" "%newxml%") else echo "%newxml%" existiert schon.
endlocal
goto:eof
endlocal
Gruss!
Hallo Jens,
falls du auch VBS nutzen kannst hier eine Lösung die funktioniert:
Einfach den Speicherort der XML-Dateien und den Backup-Ordner in Zeile 2 und 3 angeben, als *.vbs abspeichern, doppelklick, fertig.
Grüße Uwe
falls du auch VBS nutzen kannst hier eine Lösung die funktioniert:
Einfach den Speicherort der XML-Dateien und den Backup-Ordner in Zeile 2 und 3 angeben, als *.vbs abspeichern, doppelklick, fertig.
Dim strRegistration, strStartTest, strNewFileName, xmlSourceFolder
xmlSourceFolder = "A:\XMLFiles\"
strBackupPath = "V:\Test\Backup\"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set xmlSourceFolder = fso.GetFolder(xmlSourceFolder)
For Each xmlFile In xmlSourceFolder.Files
If LCase(Right(xmlFile.Name,3)) = "xml" Then
Set objXmlFile = fso.OpenTextFile(xmlFile.Path)
strContent = objXmlFile.ReadAll()
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Pattern = "<REGISTRATION>(.*)</REGISTRATION>"
Set myMatches = myRegExp.Execute(strContent)
If myMatches.Count >= 1 Then
Set myMatch = myMatches(0)
If myMatch.SubMatches.Count >= 1 Then
strRegistration = myMatch.SubMatches(0)
End If
End If
myRegExp.Pattern = "<START_TEST>(.*)</START_TEST>"
Set myMatches = myRegExp.Execute(strContent)
If myMatches.Count >= 1 Then
Set myMatch = myMatches(0)
If myMatch.SubMatches.Count >= 1 Then
strStartTest = Replace(myMatch.SubMatches(0),":","")
End If
End If
strNewFileName = strRegistration & "_" & strStartTest & ".xml"
fso.CopyFile xmlFile.Path, strBackupPath & strNewFileName
End If
Next
Set myRegExp = Nothing
Set fso = Nothing
wscript.echo "Backup fertig!"
Grüße Uwe
Hallo,
der Grund, warum es nicht ging, ist einfach, aber heimtückisch. Wenn eine ASU dokumentiert wurde, wird die Zeilenlänge über 11.000 Zeichen lang, und damit kann Batch nicht mehr umgehen. Die Grenze liegt bei 8183 Zeichen und durch meine Ersetzung wird die Zeichenkette länger. Also habe ich die mal nach 6000 Zeichen gekürzt und damit hat es dann bei allen XML's geklappt!
Gruss!
der Grund, warum es nicht ging, ist einfach, aber heimtückisch. Wenn eine ASU dokumentiert wurde, wird die Zeilenlänge über 11.000 Zeichen lang, und damit kann Batch nicht mehr umgehen. Die Grenze liegt bei 8183 Zeichen und durch meine Ersetzung wird die Zeichenkette länger. Also habe ich die mal nach 6000 Zeichen gekürzt und damit hat es dann bei allen XML's geklappt!
@echo off &setlocal
set "xmlfile="
set LF=^
REM die beiden Zeilen über dieser MÜSSEN frei und leer bleiben !!
for /f "delims=" %%i in ('dir /b /a-d *.xml ^|sort /r') do set "xmlfile=%%~i"&call:process
goto:eof
:process
set "xmlline="
for /f "usebackqdelims=" %%i in ("%xmlfile%") do if not defined xmlline set "xmlline=%%i"
setlocal enabledelayedexpansion
if not "!xmlline:~6000,1!"=="" set "xmlline=!xmlline:~0,6000!"
set "xmlline=%xmlline:><=>!LF!<%"
for /f "tokens=1,2delims=<>" %%i in ("!xmlline!")do (
if "%%i" equ "REGISTRATION" set "REGISTRATION=%%j"
if "%%i" equ "START_TEST" set "START_TEST=%%j"
)
if not defined REGISTRATION echo "%xmlfile%": REGISTRATION nicht gefunden.&goto:fin
if not defined START_TEST echo "%xmlfile%": START_TEST nicht gefunden.&goto:fin
set "START_TEST=%START_TEST::=.%"
set "newxml=%REGISTRATION%_%START_TEST%.xml"
if not exist "%newxml%" (ren "%xmlfile%" "%newxml%") else echo "%newxml%" existiert schon.
:fin
endlocal
goto:eof
endlocal
Gruss!