119678
22.07.2015, aktualisiert am 24.07.2015
1835
10
0
Per Batch Datei öffnen erste Zeile ändern und in anderer Datei zurückschreiben
Hallo an die Gemeinde ...
als Anfänger hänge ich wohl an einer einfachen Sache fest.
Es gibt eine xml Datei, die jeden Tag automatisch generiert wird nach diesem Muster:
traegerdaten_2015-07-22_020256.xml
die Datei steht im Laufwerk J:\Advantage\Live\io\export\Zusteller\DATA\
Nun möchte ich von dieser Datei nur die erste Zeile abändern:
Quelle: <?xml version="1.0"> Ziel: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
um sie dann unter: D:\traegerdaten.xml zu speichern.
Mein bisheriger Versuch sieht so aus - wobei ich schon beim auslesen der Datei scheitere, weil ich ja immer nur den aktuellen Tag auslesen will und die Uhrzeit aber nicht weiß, wann die Datei geschrieben wurde.
@echo off & SETLOCAL enabledelayedexpansion
SET "erweiterung=%date:~6,4%-%date:~3,2%-%date:~0,2%"
SET "quell_datei=J:\Advantage\Live\io\export\Zusteller\DATA\traegerdaten_%erweiterung%*"
SET "ziel_datei=D:\traegerdaten.xml"
SET "suchen_nach=<?xml version="1.0">"
SET "ersetzen_durch=<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"
Echo. Erweiterung= %erweiterung%
Echo. Quelldatei = %quell_datei%
pause
REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO SET "zeile=%%i" & CALL :ersetzen
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"
REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
ECHO.!zeile!>>"%ziel_datei%"
Wo liegen meine Fehler? - Danke
Charly
als Anfänger hänge ich wohl an einer einfachen Sache fest.
Es gibt eine xml Datei, die jeden Tag automatisch generiert wird nach diesem Muster:
traegerdaten_2015-07-22_020256.xml
die Datei steht im Laufwerk J:\Advantage\Live\io\export\Zusteller\DATA\
Nun möchte ich von dieser Datei nur die erste Zeile abändern:
Quelle: <?xml version="1.0"> Ziel: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
um sie dann unter: D:\traegerdaten.xml zu speichern.
Mein bisheriger Versuch sieht so aus - wobei ich schon beim auslesen der Datei scheitere, weil ich ja immer nur den aktuellen Tag auslesen will und die Uhrzeit aber nicht weiß, wann die Datei geschrieben wurde.
@echo off & SETLOCAL enabledelayedexpansion
SET "erweiterung=%date:~6,4%-%date:~3,2%-%date:~0,2%"
SET "quell_datei=J:\Advantage\Live\io\export\Zusteller\DATA\traegerdaten_%erweiterung%*"
SET "ziel_datei=D:\traegerdaten.xml"
SET "suchen_nach=<?xml version="1.0">"
SET "ersetzen_durch=<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"
Echo. Erweiterung= %erweiterung%
Echo. Quelldatei = %quell_datei%
pause
REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO SET "zeile=%%i" & CALL :ersetzen
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"
REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
ECHO.!zeile!>>"%ziel_datei%"
Wo liegen meine Fehler? - Danke
Charly
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 278068
Url: https://administrator.de/contentid/278068
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo Charly.
Ich kann es nur immer wieder widerholen, XML mit Batch zu editieren ist Müll.
Ich spare mir mal den Versuch das umzusetzen und hoffe statt dessen darauf, dass die PowerShell Gemeinde hier vorbei schaut...
Grüße
rubberman
Ich kann es nur immer wieder widerholen, XML mit Batch zu editieren ist Müll.
<?xml version="1.0">
Da geht es schon los. In welchem Zeichensatz liegen die Daten vor?<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Dann müsstest du die Daten aber auch tatsächlich in UTF-8 ablegen. Hast du eine Vorstellung, welche Kopfstände du machen musst, um das mit Batch zu realisieren?Ich spare mir mal den Versuch das umzusetzen und hoffe statt dessen darauf, dass die PowerShell Gemeinde hier vorbei schaut...
Grüße
rubberman
Hallo Charly.
Dir ist bewusst, dass Batch standardmäßig ASCII liest und schreibt? Könntest du dich mit einer anderen Scriptsprache als Batch begnügen? Dann fiele mir da schon was ein...
Grüße
rubberman
die Daten liegen im richtigen Format vor!
Und das wäre UTF-8? Mit oder ohne Byte Order Mark (siehst du, wenn du in einem HEX Editor öffnest)?Dir ist bewusst, dass Batch standardmäßig ASCII liest und schreibt? Könntest du dich mit einer anderen Scriptsprache als Batch begnügen? Dann fiele mir da schon was ein...
Grüße
rubberman
Hallo,
Folgender Versuch mit Powershell
Folgender Versuch mit Powershell
$path = "J:\Advantage\Live\io\export\Zusteller\DATA\"
$destination = "D:\traegerdaten.xml"
$date = Get-Date -Format yyyy-MM-dd
$filter = "traegerdaten_"+$date+"*.xml"
$file = Get-Childitem -Path $path -Filter $filter
$content = Get-Content $file
$content -replace ('<?xml version="1.0">', '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>') | Set-Content $destination
Hallo charlyby,
das hab ich zwei Varianten für dich mit Powershell (PS 3.0):
Grüße Uwe
das hab ich zwei Varianten für dich mit Powershell (PS 3.0):
Variante 1 über das XML-Object und Änderung der XML-Declaration
$filepath= 'C:\datei.xml'
$xml = [xml](gc $filepath -Encoding UTF8)
$xml.xml = 'version="1.0" encoding="UTF-8" standalone="yes"'
$xml.save($filepath)
Variante 2 (Plain durch ersetzen des Textes)
$filepath= 'C:\datei.xml'
(gc $filepath -Encoding UTF8) -replace '^<\?xml.*','<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' | set-content $filepath -Encoding UTF-8
Hallo Charly,
ursprünglich wollte ich über das XML DOM die fehlenden Attribute hinzufügen, aber
Grüße
rubberman
ursprünglich wollte ich über das XML DOM die fehlenden Attribute hinzufügen, aber
<?xml version="1.0">
ist bereits invalides XML, da das Fragezeichen vor dem Deklarationsende fehlt. Ich denke Colinardos 2. Vorschlag, mit einem regulären Ausdruck zu arbeiten, ist in dem Fall die Variante, die auch dann noch funktionieren sollte, wenn das nur versehentlich falsch gepostet wurde.Grüße
rubberman
Guten Morgen,
Ich hatte vergessen den gesamten Pfad zu verwenden $file.FullName. Was sollte passieren, wenn mehrere Dateien gefunden werden? In diesem Fall müsste ich noch eine Schleife einbauen.
geändertes Skript:
PS: Kleine Änderung im replace Code Bereich, weil ansonsten das Ausgabeformat nicht gepasst hat.
Grüße
Ich hatte vergessen den gesamten Pfad zu verwenden $file.FullName. Was sollte passieren, wenn mehrere Dateien gefunden werden? In diesem Fall müsste ich noch eine Schleife einbauen.
geändertes Skript:
$path = "J:\Advantage\Live\io\export\Zusteller\DATA\"
$destination = "D:\traegerdaten.xml"
$date = Get-Date -Format yyyy-MM-dd
$filter = "traegerdaten_"+$date+"*.xml"
$file = Get-Childitem -Path $path -Filter $filter
if ($file -ne $null) {
$content = Get-Content $file.FullName
$content -replace ('xml version="1.0">', 'xml version="1.0" encoding="UTF-8" standalone="yes"?>') | Set-Content $destination
}
PS: Kleine Änderung im replace Code Bereich, weil ansonsten das Ausgabeformat nicht gepasst hat.
Grüße