XML Tag auslesen und in Dateinamen anreichern
Hallo,
ich möchte ein XML Tag einer XML Datei auslesen lassen (LIFNR) die Werte innerhalb des Tags sollen dann an den Dateinamen angefügt werden: LIFNR_Dateiname.xml
Ich hab ein Skript gestern geschrieben, welches soweit funktionierte. Der Hintergrund ist alle XML Dateien welche sich im Order XY befinden, sollen umbenannt werden. Im heutigen Test funktioniert nur noch die 1. Datei, dann werden Fehlermeldungen zurückgeliefert, dass der Dateiname nicht mehr gefunden wird. Da ich kein Profi in Batchprogrammierung bin, bräuchte ich hier Hilfe. Evtl auch gern einen anderen Denkanstoß.
Mein Code der Datei:
Vielen Dank vorab, für jede Hilfe!
ich möchte ein XML Tag einer XML Datei auslesen lassen (LIFNR) die Werte innerhalb des Tags sollen dann an den Dateinamen angefügt werden: LIFNR_Dateiname.xml
Ich hab ein Skript gestern geschrieben, welches soweit funktionierte. Der Hintergrund ist alle XML Dateien welche sich im Order XY befinden, sollen umbenannt werden. Im heutigen Test funktioniert nur noch die 1. Datei, dann werden Fehlermeldungen zurückgeliefert, dass der Dateiname nicht mehr gefunden wird. Da ich kein Profi in Batchprogrammierung bin, bräuchte ich hier Hilfe. Evtl auch gern einen anderen Denkanstoß.
Mein Code der Datei:
:: Bereich / Variablen lokal setzen
@echo off & setlocal
set "Ordner=C:\Test"
:: Ordner nach XML Datein durchsuchen
pushd "%Ordner%"
for /f "delims=" %%i in ('dir /b/a-d *.xml') do call :ProcessFile "%%i"
popd
goto :eof
:: XML Dateien, wenn gefunden, abändern
:ProcessFile
set "Titel="
:: Suche nach XML-Tag LIFNR (Kreditorennummer)
for /f "delims=" %%b in ('dir /b/a-d *.xml') do set "file=%%b"
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -command "([xml](gc '%Ordner%\%file%')).SelectSingleNode('//LIFNR').innerText"') do set "titel=%%a"
set "NameNeu=%file%"
:: Wenn Titel gefüllt, benenne Dateinamen mit Kreditorennummer um
if defined Titel set "NameNeu=%titel%_%NameNeu%"
ren %file% "%NameNeu%"
popd
goto :eof
Vielen Dank vorab, für jede Hilfe!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 445944
Url: https://administrator.de/forum/xml-tag-auslesen-und-in-dateinamen-anreichern-445944.html
Ausgedruckt am: 22.12.2024 um 20:12 Uhr
15 Kommentare
Neuester Kommentar
Moin,
ein ungetesteter Powershell-Einzeiler:
Ich hoffe das funktioniert so. Wenn nicht, dann melde Dich mit den Fehlermeldungen. Ist der Wert nicht vorhanden, gibt es hässliche Fehlermeldungen. Außerdem sollte man noch abfangen, ob die Datei schon exisitiert.
hth
Erik
ein ungetesteter Powershell-Einzeiler:
get-childitem *.xml | foreach-object { rename-item -newname "$([xml]$(get-content $_.fullname).SelectSingleNode('//LIFNR').innerText).xml" }
Ich hoffe das funktioniert so. Wenn nicht, dann melde Dich mit den Fehlermeldungen. Ist der Wert nicht vorhanden, gibt es hässliche Fehlermeldungen. Außerdem sollte man noch abfangen, ob die Datei schon exisitiert.
hth
Erik
Danke. Jetzt hatte ich was zum Testen. Mein Fehler. Man darf das .xml nicht direkt dranhängen, da das sonst als eine Objekteigentschaft interpretiert wird. So geht's (getestet):
get-childitem *.xml | foreach-object { rename-item $_ -newname ($([xml]$(get-content $_)).SelectSingleNode('//LIFNR').innerText +".xml") }
Zitat von @erikro:
Danke. Jetzt hatte ich was zum Testen. Mein Fehler. Man darf das .xml nicht direkt dranhängen, da das sonst als eine Objekteigentschaft interpretiert wird. So geht's (getestet):
Danke. Jetzt hatte ich was zum Testen. Mein Fehler. Man darf das .xml nicht direkt dranhängen, da das sonst als eine Objekteigentschaft interpretiert wird. So geht's (getestet):
get-childitem *.xml | foreach-object { rename-item $_ -newname ($([xml]$(get-content $_)).SelectSingleNode('//LIFNR').innerText +".xml") }
So geht's (getestet):
Funktioniert aber nur solange es den Knoten auch tatsächlich in der XML-Datei gibt, und der Ursprungsname der Datei hängt auch nicht dran :-P$ordner = 'D:\Daten'
gci $ordner -Filter *.xml -File | %{
$node = ([xml]$(gc $_.Fullname)).SelectSingleNode('//LIFNR')
if ($node){
$newname = "$($node.innerText)_$($_.Basename).xml"
if (!(Test-Path "$ordner\$newname")){
rename-item $_.Fullname -newname $newname -force -verbose
}else{
write-host "Datei mit dem Namen '$newname' gibt es schon!" -F Yellow
}
}
}
sudo rm -rf /