none
XML - Objekt als File ausgeben RRS feed

  • Frage

  • Ich habe ein mein ini-File aus meiner früheren Anfrage, welches nicht zielführend beantwortet werden konnte, in ein XML - Objekt eingelesen(umgewandelt), da es mit Powershell angeblich besser bearbeitet werden kann.

    Nun würde ich gerne das XML - Objekt nicht gleich wieder in das Ini-File zurückkonvertieren, sondern vorher filtern und bearbeiten. Dabei ist meine Frage: Wie kann ich eine eingelesenes XML - Objekt (und Teile davon) in ein XML - File ausgeben um den Bearbeitungsstatus zu überwachen.

    Anbei der Teil des Ini-Files, bei dem die Filter-Abfrage einen Match erzeugen müsste.


    [SASIMAP]
    FileName=C:\Program Files (x86)\VBScript\CScript.exe
    Arguments="C:\Windows\Application Compatibility Scripts\Logon\SASEGUIDEADM4.vbs" //B //NoLogo //T:60
    UserGroups=Domainname\gl_w_SASIMAP
    Description=SASIMAP
    Wait=0
    WindowStyle=1
    [SASOLAP]
    FileName=C:\Program Files (x86)\VBScript\CScript.exe
    Arguments="C:\Windows\Application Compatibility Scripts\Logon\SASEGUIDEADM4.vbs" //B //NoLogo //T:60
    UserGroups=Domainname\gl_w_SASIMAP
    Description=SASOLAP
    Wait=0
    WindowStyle=1

    Anbei der Code um ein INI-File in ein XML Objekt einzulesen und wieder zurückzukonvertieren (Quelle: Martijn van Braagt)

    .DESCRIPTION
            Konvertiert das LoginManager.Ini-File Section für Section in ein XML Objekt. Was noch fehlt ist dass dabei 
            alle Sektionen, welche gleiche variable Werte in den Keys Arguments= haben
            und zusätzlich auch gleiche aber variable Werte in den Keys UserGroups= besitzen herausgefiltert werden.
            Trifft das Match-Kriterium zu, dann werden die überzähligen Sektionen bis auf eine gelöscht.
            Danach wandelt das Programm das bearbeitete XML-Objekt wieder ein neues ini-File (New_LoginMgr.ini) um.

    Function Parse-IniFile ($file)
    {
        [String]$iniXMLString = '<?xml version="1.0" ?><ini>'
        $opentag = ""
        switch -regex -file $file
        {
            "^\[(.+)\]$"
            {
                if ($opentag -ne "") { $iniXMLString += "</" + $opentag + ">" }
                $section = $matches[1].Trim()
                $iniXMLString += "<" + $section + ">"
                $opentag = $section
            }
            "^\s*([^#].+?)\s*=\s*(.*)"
            {
                $name, $value = $matches[1..2]
                $iniXMLString += "<" + $name + ">" + $value + "</" + $name + ">"
            }
        }
        if ($tagopen -ne "") { $iniXMLString += "</" + $opentag + ">" }
        $iniXMLString += "</ini>"
        Return $iniXMLString
    }
    # Parse Ini / Ini-File einlesen
    $iniXMLString = Parse-IniFile "C:\Program Files\visionapp\LoginManager\LoginMgr_old.ini"
    [xml]$iniXML = $iniXMLString

    # Funktion Loop XML (Einlesen Child Nodes)
    Function Loop-XML($node, $first)
    {
        $returnValue = ""
        if ($node.HasChildNodes)
        {
            if ($node.FirstChild.Name -eq "#text")
            {
                $returnValue += ($node.name + "=" + $node.FirstChild.value) + "`r`n"
            }
            else
            {
                if (!$first)
                {
                    $returnValue += ("[" + $node.name + "]") + "`r`n"
                }
            }
            foreach ($item in $node.ChildNodes)
            {
                $returnValue += (Loop-XML $item $FALSE)
            }
        }
    Return $returnValue
    }

    # Neues Ini-File aus dem XML-Objekt wieder mit Inhalt füllen (Hier nur die Sectionen zurückschreiben, welche nicht matchen, das würde das explizite Löschen ersparen.)
     $newIni = Loop-XML $iniXML.ini $true
    Set-Content "C:\Program Files\visionapp\LoginManager\New_LoginMgr.ini" $newIni

    Bin für jeden Vorschlag dankbar.

    Montag, 10. August 2015 13:47

Antworten

  • Hallo,

    du kannst die XML erstmal bequem einlesen:


    [xml] $configXml = Get-Content -Path ".\Config.xml" -ErrorAction 'Stop'

    Anschließend bearbeiten / auslesen usw.

    #Ausgeben
    $configXml.config.DBConnectionString
    
    #Setzen
    $configXml.config.DBConnectionString="Neuer String"
    
    #Mit Where Bedingung
     $ADGroup = ($configXML.Config.AdLocations.Ref  | Where-Object {$_.Agentur -eq "Agentur1"} 
    
    #Zwischenspeichern / festschreiben
    $configXml.Save("c:\temp\config.xml")

    Hier noch ein paar gute Anwendungsbeispiele:

    http://blogs.technet.com/b/chitpro-de/archive/2007/10/09/windows-powershell-in-der-praxis-xml-verarbeitung-von-jan-moser.aspx

    http://www.heise.de/ix/artikel/Datenzugriff-506816.html

    LG David


    Montag, 10. August 2015 18:52