Jump to content

PowerShell Bearbeitung richtig Speichern


Direkt zur Lösung Gelöst von Proll012,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 zu diesem Kommentar

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 zu diesem Kommentar

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 von BOfH_666
Link zu diesem Kommentar

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 zu diesem Kommentar
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 zu diesem Kommentar

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

 

Link zu diesem Kommentar
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 zu diesem Kommentar
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 von BOfH_666
Link zu diesem Kommentar

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 von NilsK
Link zu diesem Kommentar
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 zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...