Jump to content

PowerShell Bearbeitung richtig Speichern


Go to solution Solved by Proll012,

Recommended Posts

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 

Link to post

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

 

Link to post

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.

Link to post

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

 

Link to post

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.

Edited by BOfH_666
Link to post

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. 

Link to post

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?

Link to post
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. :grins2:

 

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. :D

 

 

 

Link to post

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

 

  • Like 1
Link to post

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.

  • Like 1
Link to post
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 :lol2: ...:crying:

 

$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. 

Link to post
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

Edited by BOfH_666
  • Like 1
Link to post

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

 

Edited by NilsK
Link to post
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 :lool: Ich dachte ich bin ganz knapp vor der Lösung :lol2:

Und während ich vor 2 Wochen noch gar nichts verstanden habe, versteh ich jetzt doch schon deutlich mehr. :))

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...