Jump to content

Xml datei mit Batch bearbeiten


Go to solution Solved by Proll012,

Recommended Posts

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

Hallo @Proll012,

 

das ist eine schöne Aufgabe für ein Skript. Mal davon abgesehen, dass ich eher PowerShell empfehlen würde, weil ich mich mit Batch dafür nicht gut genug auskenne und weil PowerShell auch die neuere und mächtigere Skriptsprache ist, klingt der Plan ganz gut. Was ist denn die eigentliche Frage?  ;-) 

Link to post

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

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

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

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

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 to post
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 to post
vor einer Stunde schrieb Proll012:

Wenn mir da jemand helfen kann das anzupassen wäre das extrem nett.

 

Das hatten wir ja weiter oben ja bereits begonnen. Poste doch bitte mal den PowerShell-Code, den Du hast. Dann sehen wir, wo es noch klemmt. 

  • Like 1
Link to post

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

 

Edited by Proll012
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...