Benutzer mit den meisten Antworten
XML - Objekt als File ausgeben

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" $newIniBin für jeden Vorschlag dankbar.
- Typ geändert Denniver ReiningMVP, Moderator Mittwoch, 28. Oktober 2015 13:11 Es ist und bleibt eine Frage :)
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
- Bearbeitet David das Neves Montag, 10. August 2015 18:53
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 28. Oktober 2015 13:11