Proll012 0 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Guten Tag, Ich bin dabei xml Daten aus einem Verzeichnis einzulesen und diese zu bearbeiten. Jedoch weiß ich nicht und finde nichts wie ich diese einzeln wieder Speicher. $files = Get-ChildItem C:\Users\Myname\Desktop\Auobearbeitungtest -Recurse *.xml | Foreach-Object { [xml] $content = Get-Content $_.FullName } $NewRawXML=$content|%{ if ($_ -match '\<BMECAT\s*'){ $_ -replace '\s*xmlns\=".*"','' } else{ $_ }} Wenn ich die Dateien einzeln einspiele und einzeln wieder ausspiele geht natürlich alles wunderbar. Aber wie mache ich das hier? In der Originaldatei oder unter dem Original Namen in einem neuen Verzeichnis wäre supi. Danke und liebe Grüße Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Moin, das Objekt $NewRawXML enthält die Daten, die du verändert hast. Also musst du dieses Objekt in eine Datei schreiben. Zumindest ist das die Methode, die zum Rest deines Skripts passt. Gruß, Nils Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 Moin Nils, vor 3 Minuten schrieb NilsK: Zumindest ist das die Methode, die zum Rest deines Skripts passt. hmm, ich bin ziemlich neu in dem Thema. Kann sein das ich etwas will das so nicht funktioniert. Ich habe 3 Dateien in dem Verzeichnis. Und die sollen alle durch die Prüfung und dann wieder in einzelne Dateien zurück. C:\Users\Myname\Desktop\Auobearbeitungtest Ich bin davon ausgegangen, das mir nur der Code zum Speichern in einzelne Dateien fehlt. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Moin, ja, der fehlt dir ja auch. Er kann aber sehr simpel sein, so in der Art: $NewRawXML | Out-File 'c:\Pfad\Dateiname.xml' Statt des festen Pfads dann eben eine passend zusammengebaute Variable. Gruß, Nils Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 Achso, ok danke, dann Funktioniert mein Skript nicht so wie erhofft..:D Wenn du sagen magst/kannst, wie mache ich das denn, dass der jede gezogene Datei einzeln durch die Prüfung schickt? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 (bearbeitet) Das hatten wir doch in Deinem anderen Thread schon mit gezeigt ... wenn Du eine XML-Datei mit ... $XmlData = [xml](Get-Content -Path 'C:\Users\MeinName\Desktop\DE_nv2040.xml') eingelesen hast, kannst Du sie mit .... $XmlData.Save('C:\Users\MeinName\Desktop\DE_nv2040.xml') speichern. Nur dass Du in diesem Fall eben keine direkten Pfade angibst, sondern Variablen. bearbeitet 5. Oktober 2021 von BOfH_666 Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 Ja das weiß ich mittlerweile. Ich habe auch versucht das mit Variablen zu Speichern. Aber wenn ich z.B. $XmlData.Save($FinishedXml) Eintrage passiert nichts und ich weiß nicht wie ich das sonst schreiben soll/kann. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Was genau steht denn in der Variablen "$FinishedXml"? Wenn Du die Original-XML-Dateien überschreiben möchtest, solltest Du an der Stelle die gleiche Variable eintragen, die Du an der Stelle hast, wo Du die Datei einliest!! And BTW: ... hab ich grad erst drauf geachtet - meistens ist es keine gute Idee, in einer XML-Datei mit einfachen String-Ersetzungen zu arbeiten. Was stört denn an den Attributen? Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 vor 3 Minuten schrieb BOfH_666: Was genau steht denn in der Variablen "$FinishedXml"? Das war nur ein Beispiel, das wäre $NewRawXML im oben genannten Skript. Und darin sollte soweit ich richtig verstehe die überarbeitete Datei drin stehen. vor 6 Minuten schrieb BOfH_666: And BTW: ... hab ich grad erst drauf geachtet - meistens ist es keine gute Idee, in einer XML-Datei mit einfachen String-Ersetzungen zu arbeiten. Was stört denn an den Attributen? Der Link von BMECAT muss raus dann erkennt PowerShell das als richtiges xml. Ergo wird FVALUE beim ";" gesplittet neu verknotet und der alte FVALUE wird dann auch gelöscht. Es geht mir aber gar nicht so sehr darum. Die Links manuell raus zu Löschen ist nicht so das Problem. Viel mehr das manuelle eintragen einzelner Dateien. Haben zu Soll Pfad. Aber ich versuche das nochmal, wenn ich richtig deute, habe ich wohl nur die Variable in .save($...) eingetragen. Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Moin, vor 2 Minuten schrieb Proll012: Das war nur ein Beispiel, das wäre $NewRawXML im oben genannten Skript. Und darin sollte soweit ich richtig verstehe die überarbeitete Datei drin stehen. nein. In $NewRawXML steht der Inhalt der Datei, den du geändert hast. In der Save-Methode brauchst du aber den Dateinamen, unter dem die Datei gespeichert werden soll. Das ist in Olafs Beispiel ja auch gut zu sehen. Gruß, Nils 1 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 Ich fürchte, Du haust da Einiges gehörig durcheinander. Wenn Du eine XML-Datei einliest und das auch als [XML]-Typ, dann solltest Du ausschließlich XML-Methoden für die Manipulation verwenden. Wenn Du eine "einfache String Ersetzung" machen möchtest, brauchst Du nicht explizit den XML-Typ erzwingen. 1 Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 vor 7 Minuten schrieb NilsK: In der Save-Methode brauchst du aber den Dateinamen, unter dem die Datei gespeichert werden soll Puh keine Ahnung welche Variable ich dann angeben muss, damit der jede eingespielten Datei unter dem eingespielten Namen in ein anderes Verzeichnis speichert.:( vor 8 Minuten schrieb BOfH_666: Ich fürchte, Du haust da Einiges gehörig durcheinander Da bin ich mir sicher ... $files = Get-ChildItem C:\Users\sluet\Desktop\XmlFutterTest -Recurse *.xml Foreach-Object { [xml]$XmlData = Get-Content $files } foreach ($Feature in ($XmlData.BMECAT.T_NEW_CATALOG.PRODUCT.PRODUCT_FEATURES).FEATURE ) { if ($Feature.FVALUE -match ";") { $SplittedFVALUE = ($Feature.FVALUE -split ';').trim() foreach ($Value in $SplittedFVALUE) { $child = $XmlData.CreateNode("element", "FVALUE", " ") $child.InnerText = $Value $Feature.AppendChild($child) }} $ItemToRemove = $Feature.SelectSingleNode('FVALUE') $Feature.RemoveChild($ItemToRemove) } $XmlData.Save($files) Könnt ihr mir denn sagen, was ich hier falsch mache? Versuche hier das Selbe wie oben. Zu Foreach-Object {[xml]$XmlData = Get-Content $files } Gibt der mir ein Fehler aus. Das der dazu nichts findet. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 (bearbeitet) vor 21 Minuten schrieb Proll012: Könnt ihr mir denn sagen, was ich hier falsch mache? Ich weiß gar nicht, wo ich da anfangen soll .... und das ist nicht böse gemeint. Du hast in den ersten 5 Zeilen 8 Syntax-Fehler. Wenn ich mich nicht irre, hatte ich Dir schon mal empfohlen, Dir als Erstes die Grundlagen von PowerShell im Speziellen und Scripting im Allgemeinen anzueignen. Du tust Dir selbst und uns allen keinen Gefallen, wenn Du das überspringst. Es heißt nicht umsonst "Grundlagen"!! ... alles andere baut darauf auf. Edit: z.B. ist Foreach nicht gleich Foreach .... https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7.1 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-7.1 bearbeitet 5. Oktober 2021 von BOfH_666 1 Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 5. Oktober 2021 Melden Teilen Geschrieben 5. Oktober 2021 (bearbeitet) Moin, hui, du probierst gern wild rum oder? vor 23 Minuten schrieb Proll012: Puh keine Ahnung welche Variable ich dann angeben muss, damit der jede eingespielten Datei unter dem eingespielten Namen in ein anderes Verzeichnis speichert. Wo stehen denn die Verzeichnisse, in die das Skript speichern soll? Falls die noch in keiner Variablen stehen, musst du die eben definieren. Irgendeine Logik wird es ja geben, nach der der Speicherort zu bilden ist. vor 23 Minuten schrieb Proll012: $XmlData.Save($files) Hier versuchst du, die Datei an dem Ort zu speichern, der durch $files angegeben wird. Wenn du jetzt aber mal oben in deinem Skript guckst, was in $files steht - dann siehst du, dass das ein Array ist, das sämtliche Dateiobjekte aus dem Suchpfad enthält. Ist also eher unwahrscheinlich, dass das klappt. Dein Skript hat keine Variable, die den Dateinamen enthält. Und ganz nebenbei: Es enthält auch keine Schleife, die alle Dateien wirksam durchgehen würde. Die betreffende Schleife (wenn man von den Syntaxfehlern absieht) weist nacheinander den Inhalt jeder Datei derselben Einzelvariable zu, sodass diese vermutlich am Ende nur den Inhalt der letzten Datei im Ordner enthält. Gruß, Nils bearbeitet 5. Oktober 2021 von NilsK Zitieren Link zu diesem Kommentar
Proll012 0 Geschrieben 5. Oktober 2021 Autor Melden Teilen Geschrieben 5. Oktober 2021 vor 8 Minuten schrieb BOfH_666: nicht böse gemeint. Du hast in den ersten 5 Zeilen 8 Syntax-Fehler vor 6 Minuten schrieb NilsK: hui, du probierst gern wild rum oder? Leute was soll ich sagen Ich dachte ich bin ganz knapp vor der Lösung Und während ich vor 2 Wochen noch gar nichts verstanden habe, versteh ich jetzt doch schon deutlich mehr. :)) Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.