Benutzer mit den meisten Antworten
xml-Datei nach String durchsuchen

Frage
-
Hallo,
ich schreibe gerade ein Script, mit dem über eine grafische Oberfläche ausgewählt werden kann, welche Gruppenrichtlinien Importiert werden sollen. Im Voraus ist ein Backup aller Gruppenrichtlinien durchgeführt worden, das in einem extra Ordner abgelegt wurde. Dazu wurden in diesem Ordner ein GPO-Report im xml-Format gespeichert.
Nun möchte ich aus dieser XML-Datei die Namen der gesicherten Gruppenrichtlinien auslesen und in der grafischen Oberfläche ausgeben. Hier ein ausschnitt der xml-Datei:
...
- <GPO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.microsoft.com/GroupPolicy/Settings"> - <Identifier> <Identifier xmlns="http://www.microsoft.com/GroupPolicy/Types">{1854B306-87B3-4F41-9F6E-C5D91B659156}</Identifier> <Domain xmlns="http://www.microsoft.com/GroupPolicy/Types">motest.de</Domain> </Identifier> <Name>testpolicy</Name>
...
Mein erster Versuch:
$ReportFile=Get-Content "$path\$directory\GPOReport.xml" foreach($line in $ReportFile) { $tmp=$test.Contains("<Name>") if($tmp) { $name=$test.Substring(8) $length=$name.Length $gpoName=$gpoName+$name.Substring(0, $length-7) } }
Das Problem das auftauchte: In der xml-Datei sind mehrere "<Name>"-Tags zu finden, die nicht alle einen Gruppenrichtlinienname enthalten. Deswegen kam mir die Idee, erst nach dem Tag "<GPO" zu suchen, und dann nach dem Tag "<Name>". Soweit klappt das auch mit folgendem Code:
$ReportFile=Get-Content "$path\$directory\GPOReport.xml"
foreach($line in $ReportFile) { $tmp1=$line.Contains("<GPO") if($tmp1) { foreach($test in $ReportFile) { $tmp2=$test.Contains("<Name>") if($tmp2) { $name=$test.Substring(8) $length=$name.Length $gpoName=$gpoName+$name.Substring(0, $length-7) break } } } }
Allerdings wird die Datei immer wieder von neuem durchsucht und nicht an vorheriger Stelle weiter durchsucht.
Hat jemand einen Tipp für mich, wie ich dieses Problem lösen kann?
Vielen Dank im Voraus für die Hilfe.
Viele Grüße
Darkholylein
Antworten
-
Hallo,
da es sich offensichtlich um eine gültige XML datei handelt, würde ich sie auch als [XML] laden und dann die entsprechenden Knoten auswählen. Leider lässt sich aus deinem Auszug die Gesamtstruktur der Datei nicht herauslesen, sonst könnte ich dir ein Script posten. Aber hier ein Beispiel:
Für folgende XML-Datei:
<?xml version="1.0"?> <Backups> <GPO> <Name>MeineGPO1</Name> </GPO> <WASanderes> <Name>xyz</Name> </WASanderes> <GPO> <Name>MeineGPO2</Name> </GPO> <WASanderes> <Name>abcde</Name> </WASanderes> </Backups>
wäre eine Möglichkeit um in allen GPO-Knoten die Namen auszulesen, z.B. dieser:$GPOBackupXmlData = [xml](Get-Content "D:\test.xml" ) $node = $GPOBackupXmlData.Backups.GPO $GPOnames = @() foreach ($entry in $node){ $GPOnames = $GPOnames + $entry.Name } Write-host $GPOnames
Grüße, Denniver- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 9. November 2010 06:31
- Als Antwort markiert Darkholylein Dienstag, 9. November 2010 16:49
Alle Antworten
-
Hallo,
da es sich offensichtlich um eine gültige XML datei handelt, würde ich sie auch als [XML] laden und dann die entsprechenden Knoten auswählen. Leider lässt sich aus deinem Auszug die Gesamtstruktur der Datei nicht herauslesen, sonst könnte ich dir ein Script posten. Aber hier ein Beispiel:
Für folgende XML-Datei:
<?xml version="1.0"?> <Backups> <GPO> <Name>MeineGPO1</Name> </GPO> <WASanderes> <Name>xyz</Name> </WASanderes> <GPO> <Name>MeineGPO2</Name> </GPO> <WASanderes> <Name>abcde</Name> </WASanderes> </Backups>
wäre eine Möglichkeit um in allen GPO-Knoten die Namen auszulesen, z.B. dieser:$GPOBackupXmlData = [xml](Get-Content "D:\test.xml" ) $node = $GPOBackupXmlData.Backups.GPO $GPOnames = @() foreach ($entry in $node){ $GPOnames = $GPOnames + $entry.Name } Write-host $GPOnames
Grüße, Denniver- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 9. November 2010 06:31
- Als Antwort markiert Darkholylein Dienstag, 9. November 2010 16:49