119678
Goto Top

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

Content-ID: 278068

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

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

rubberman
rubberman 22.07.2015 um 19:14:31 Uhr
Goto Top
Hallo Charly.

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
119678
119678 22.07.2015 um 19:35:28 Uhr
Goto Top
Hallo Rubberman,

danke für deine Antwort- die Arbeit mache ich ja derzeit per Hand - die Daten liegen im richtigen Format vor!
Nur möchte ich während meines Urlaubes meinen Kollegen per batch ermöglichen.

Gruß
Charly
rubberman
rubberman 22.07.2015 aktualisiert um 21:54:12 Uhr
Goto Top
Hallo Charly.

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
119678
119678 23.07.2015 um 07:39:00 Uhr
Goto Top
Guten Morgen Rubberman,

hatte mich auch schon kurz mit Powershell beschäftigt.

Die Daten liegen in UTF-8 ohne BOM vor - und ich bin für jede Lösung offen, wenn ich in der Lage bin diese umzusetzen face-wink

Danke

Charly
SeriousEE
SeriousEE 23.07.2015 aktualisiert um 16:41:36 Uhr
Goto Top
Hallo,

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  
119678
119678 23.07.2015 um 17:04:42 Uhr
Goto Top
Hallo SeriousEE

danke für deine Mühe .... habe es gerade getestet:
folgende Fehlermeldung:
Get-Content : Der Pfad "C:\Users\khbrand.MZV\traegerdaten_2015-07-23_020327.xml" kann nicht gefunden werden, da er nich
t vorhanden ist.
Bei Zeile:1 Zeichen:23

back-to-top$content = Get-Content <<<< $file

+ CategoryInfo : ObjectNotFound: (C:\Users\khbran...7-23_020327.xml:String) [Get-Content], ItemNotFoundEx
ception
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Die Datei: J:\Advantage\Live\io\export\Zusteller\DATA\traegerdaten_2015-07-23_020327.xml gibt es - auch mit Inhalt
(erste Zeile: <?xml version="1.0">)

Da muss wohl in Zeile 06 noch etwas umgestellt werden bzw. 07

Danke
colinardo
colinardo 23.07.2015 aktualisiert um 17:28:58 Uhr
Goto Top
Hallo charlyby,
das hab ich zwei Varianten für dich mit Powershell (PS 3.0):
back-to-topVariante 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)
back-to-topVariante 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  
Grüße Uwe
rubberman
rubberman 23.07.2015 um 20:14:20 Uhr
Goto Top
Hallo Charly,

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
SeriousEE
Lösung SeriousEE 24.07.2015 aktualisiert um 10:08:53 Uhr
Goto Top
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:
$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
119678
119678 24.07.2015 um 10:08:44 Uhr
Goto Top
Hallo SeriousEE,

danke für deine Hilfe.

Zuerst bekam ich noch eine Fehlermeldung:
Index in einem Objekt vom Typ "System.IO.FileInfo" kann nicht erstellt werden.
Bei Zeile:2 Zeichen:32

back-to-top$content = Get-Content $file[ <<<< 0].FullName

+ CategoryInfo : InvalidOperation: (0:Int32) , RuntimeException
+ FullyQualifiedErrorId : CannotIndex

Als ich dann nur $file.FullName setze, brachte dein Skript genau das Ergebnis, welches ich wollte.
Die Datei ist immer nur einmal pro Tag verfügbar!

schönes Wochenende

Charly