jms979
Goto Top

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


: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

Content-Key: 205452

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

Printed on: April 16, 2024 at 10:04 o'clock

Member: Endoro
Endoro Apr 22, 2013 at 17:29:07 (UTC)
Goto Top
Hallo Jens,

das ist eine putzige XML: alles in einer Zeile.
Bist du sicher, dass du die richtig kopiert hast?


Gruss!
Member: JMS979
JMS979 Apr 22, 2013 at 17:36:45 (UTC)
Goto Top
ich hab versucht sie so Original wie möglich zu belassen...

Ist nach ASA Network Standard (für Werkstattvernetzung)aufgebaut...

im Internet Explorer wird die Datei auch mit ihrer Struktur angezeigt...

in Phase5.6 kann ich sie nicht öffnen...


mit dem Programm kann man ein vollwertiges Duplikat erzeugen...


Gruß
Member: JMS979
JMS979 Apr 22, 2013 updated at 18:06:50 (UTC)
Goto Top
Hab eben nochmal eine Datei direkt von Diskette hochgeladen

hier ein 2. Beispiel

könnte evtl. (nach hinten heraus...) etwas anders aufgebaut sein (OBD AU) aber die betreffenden Felder sind vorhanden...


Gruß Jens
Member: Endoro
Endoro Apr 22, 2013 updated at 18:53:48 (UTC)
Goto Top
Hallo,

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
Den Dateinamen fügst du als "xmlfile" ein. Und auf die zwei Leerzeilen achten, sonst geht's nicht.

Viel Spass noch und Gruss!
Member: JMS979
JMS979 Apr 22, 2013 updated at 19:00:42 (UTC)
Goto Top
face-smile genial und rasend schnell face-smile


so ziemlich genau das Ergebnis das ich seit Wochen suche....


kann man auch mehrere Dateien (ganzen Ordner mit XML) bearbeiten ??? *.XML???


Gruß und danke erstmal
Member: Endoro
Endoro Apr 22, 2013 updated at 19:48:14 (UTC)
Goto Top
Hallo,

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!
Member: JMS979
JMS979 Apr 22, 2013 at 19:54:08 (UTC)
Goto Top
Ich bin sehr dankbar das ich hier Hilfe bekomme... (komme mir fast schon blöd vor "nur" LKW reparieren zu können face-wink )


beim aktuellen Code werden nur 9 Dateien umbenannt...

evtl. helfen mehrere Dateien zum testen 204 Stück


Danke Gruß Jens
Member: colinardo
colinardo Apr 22, 2013 updated at 21:10:16 (UTC)
Goto Top
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.

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
Member: Endoro
Endoro Apr 22, 2013 updated at 21:48:13 (UTC)
Goto Top
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!
@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!
Member: JMS979
JMS979 Apr 22, 2013 at 21:27:09 (UTC)
Goto Top
Mensch ihr seid wirklich klasse!!!!!


Vielen Dank für die schnelle Hilfe...
hätt ich mal gleich nach fachgerechter Hilfe gesucht...


Gruß Jens