Jump to content

Xml datei mit Batch bearbeiten


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

Hallo, 

 

ich habe einen Ordner voller Xml Dateien. 

in einigen dieser Dateien befindet sich folgendes Problem:

 

Zeile X:  <Anfang> XYZ; 22 </ende>

 

diese Zeile soll bei dem Semikolon in 2 Zeilen aufgeteilt werden. 

 

Jetzt möchte ich das so machen, das ich eine Batch Datei habe, welche die XML Dateien im Ordner durchgeht

und diese Zeilen immer in 2 aufteilt. Das Semikolon ist dann natürlich nicht mehr gebraucht. 

 

Liebe Grüße und danke im Voraus 

Link zu diesem Kommentar

Also danke erstmal, die Frage ist, 

 

wie ich es schaffe automatisch, xml daten in einem Ordner, nach einer Bestimmten Zeile zu durchsuchen und diese Unabhängig vom Geschriebenen Inhalt beim Semikolon in Zwei Zeilen aufteile. Beispiel

 

<Anfang> XYZ; 22 </ende>

 

Bearbeitet soll es so sein 

<Anfang> XYZ</ende>

<Anfang> 22</ende>

 

 

 

Link zu diesem Kommentar

Hmmm ... das klingt, als hättest Du eher keine Kenntnisse im Skripten allgemein, oder?

 

Wenn Du damit anfangen möchtest, würde ich Dir - wie oben schon erwähnt - eher PowerShell als Batch empfehlen. Man bekommt im Zweifel auch mehr und schneller Hilfe dafür im Netz.

 

Vielleicht schaust Du Dir mal die Hilfe zu den folgenden cmdlets (so heißen die Befehle in PowerShell) an:

 

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.1

 

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.1

 

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.utility/out-file?view=powershell-7.1

 

Du solltest die Hilfe jeweils komplett inklusive der Beispiele lesen, um zu lernen wie sie verwendet werden. Wenn Du Probleme mit Code hast, den Du geschrieben hast, kannst Du den hier posten und wir werden nach Kräften versuchen Dir zu helfen aber wir schreiben hier keinen gebrauchsfertigen Code auf Anfrage. Das wäre mehr als unfair gegenüber Leuten, die damit ihr Geld verdienen (müssen).

Link zu diesem Kommentar

Ja hast du wohl recht, 

 

bin Azubi. Ich hab im netzt paar "Vorlagen" gefunden und versuch mich darüber an meine Problemlösung zu wurschteln. 

Jemanden dafür zu bezahlen kommt eher nicht infrage :D

 

# Ausgangspfad der Datei-Suche            
$quellpfad = "X:\Experiment,Test"            
           
# Alle Dateien mit der Endung *.xml Rekursiv in ein Array schreiben            
$allexml = Get-ChildItem $quellpfad "*.xml" -Recurse            
            
# Array für Standorte Anlegen            
$FVALUE = @()            
            
# Alle Standorte aller XML-Elemente in das Array $Standorte schreiben            
foreach ($xmlobjekt in $allexml)            
    {            
            
    # Holen des Inhalts der XML Datei            
    [xml]$xml = Get-Content $xmlobjekt.FullName            
            
    # Abrufen der Standortinformationen aus den Server-Elementen und an Array anhängen            
    $FVALUE += (Select-Xml -Xml $xml -XPath '//Server').Node.Informationen.FVALUE            
                
    }            
            
# Ausgabe des Arrays Gruppiert nach den Werten            
$FVALUE.GetEnumerator() | Group-Object            
            
# Inhalte der XML-Elemente mit XPath suchen und ersetzen            
foreach ($xmlobjekt in $allexml)            
    {            
            
        # Inhalt der XML-Date in $xml laden            
        [xml]$xml = Get-Content $xmlobjekt.FullName            
            
        # Für jedes Element in der XML Datei unter 'Server' durchlaufen            
        foreach ($server in (Select-Xml -Xml $xml -XPath '//Server'))            
            {            
            
                # Falls in FVALUE ein ; ist             
                if ($server.Node.Informationen.FVALUE -like "*;*")            
                    {            
            
                        # FVALUE neu setzten auf Inhalt vor ;           
                        $server.Node.Informationen.FVALUE = "*"            
                                
                    }            
            
                # Speichern der XML Datei am ursprünglichen Ort            
                $xml.Save($xmlobjekt.FullName)            
            
            }            
            
    }            
            
# Direkt Dateien nach Text durchsuchen und ersetzen            
foreach ($datei in $allexml)            
    {            
            
        # Kompletten Inhalt der Datei in Variabel laden             
        $text = Get-Content $datei.FullName            
            
        # Variabel neu schreiben und Freiburg durch Hamburg ersetzen            
        $text = $text.Replace("*;*","*")            
            
        # Schreiben des Inhaltes von $Text in die ursprüngliche Datei            
        Set-Content $datei.FullName $text            
    }

 

 

versuche gerade hierrüber annähernd irgendwas Funktionierendes hinzubekommen. Ursprünglich ging es in dem Script um Standortveränderung. 

Link zu diesem Kommentar

OK - Hausaufgabe also. Da fällt es dann ja sowieso erst recht flach, dass Du hier was Fertiges bekommst.  ;-)  Und Dein Ausbilder würde mich bestimmt auch im Traum heimsuchen, wenn ich Dir das, was Du im Netz gefunden hast, einfach für Deine Aufgabe passend machen würde. Du sollst es ja schließlich verstehen/lernen.

 

Ich würde Dir also empfehlen, Deine Aufgabe in einzelne kleine überschaubare Teile zu zerlegen und diese aufeinander aufbauend in Dein Skript einzubauen. Als ersten Teil würde ich vorschlagen, dass Du Dir alle XML-Dateien im gewünschten Verzeichnis auslisten lässt. Wenn der Schritt funktioniert und Du es verstanden hast, wie und warum es funktioniert, erweiterst Du um den nächsten Schritt ... usw.

 

Und bitte nicht jede einzelne Zeile kommentieren - das ist zu viel.  PowerShell-Code ist ziemlich "sprechend". Jeder, der auch nur annähernd der englischen Sprache mächtig ist, kann sich vorstellen, dass man z.B. mit "Get-Content" den Inhalt eines Objektes erhält.

 

Und bitte, wenn Du hier Code postest, formatier den doch bitte auch als Code.

Danke schon mal im Voraus.

 

Link zu diesem Kommentar

Guten Morgen, 

bin ein bisschen weiter, trotzdem tut das Programm noch nicht so richtig. 

es wird eine leere Ausgabedatei erzeugt aber es gibt keine Änderungen am Original. 

Nochmal zum Ziel: Das Programm soll in einer xml Datei nach <FVALUE> suchen und den Inhalt z.B:<FVALUE>XYZ; 52; green</FVALUE>, beim Semikolon trennen.

Dann sollen die Schnipsel in neuen Zeilen wieder in <FVALUE> verpackt werden. 

<FV>XYZ</FV>

<FV>52</FV>

<FV>green</FV>

 

@echo off
chcp 65001 >nul

set "XMLFile=DE_nv2045"
set "outFile=new.%XMLFile%"
  
(call ) >"%outFile%"
  
for "tokens=1* delims=]" %%a in ('type "%XMLFile%"^|find /v /n ""') do (
  
  echo %%b|find /i "<FVALUE>" && (
     
    for /f "tokens=1* delims=;" %%f in ("%%b") do (
        
      >>"%outFile%" echo %%f^</FVALUE^>
       
      >>"%outFile%" echo ^<FVALUE^>%%g
    )
  ) || (
     
    >>"%outFile%" echo:%%b
  )
)
Link zu diesem Kommentar
vor 50 Minuten schrieb Proll012:

 


@echo off
chcp 65001 >nul

set "XMLFile=DE_nv2045"
set "outFile=new.%XMLFile%"
  
(call ) >"%outFile%"
  
for "tokens=1* delims=]" %%a in ('type "%XMLFile%"^|find /v /n ""') do (
  
...

 

Hallo Proll012,

 

du solltest dich auf eine Scriptsprache festlegen. Schreibst du das jetzt in der 20+ Jahre alten Batch oder in der Powershell?

Link zu diesem Kommentar

eRROR.PNG.984d5b6662c74b31c4dcafc5fc418030.PNG

 

Das ist der einzige Code den ich habe O.o 

 

@echo off
chcp 65001 >nul

set "XMLFile=DE_nv2045"
set "outFile=new.%XMLFile%"
  
(call ) >"%outFile%"
  
for "tokens=1* delims=]" %%a in ('type "%XMLFile%"^|find /v /n ""') do (
   
  echo %%b|find /i "<FVALUE>" && (
   
    for /f "tokens=1* delims=;" %%f in ("%%b") do (
        
      >>"%outFile%" echo %%f^</FVALUE^>
      
      >>"%outFile%" echo ^<FVALUE^>%%g
    )
  ) || (
    
    >>"%outFile%" echo:%%b
  )
)

echo 
type "%outFile%"
pause

 

bearbeitet von Proll012
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...