Hallo zusammen,
um ein wenig von dem Grundlagentraining weg zu kommen, zeige ich euch heute, wie Ihr XML-Dateien mit Powershell nutzen könnt.
Hier habe ich euch ein kleines Howto geschrieben wie man XML-Dateien mit Microsoft Excel und Notepad vorbereitet. Zusätzlich könnt ihr hier die XML-Templates herunterladen.
XML-Dateien für Powershell vorbereiten
XML-Dateien Templates Download
Wie fragt man nun die Struktur einer XML-Datei ab? Hier ein kleines Schaubild.
Fangen wir an, eine XML-Struktur mit Powershell abzufragen. 🙂
Um mit XML-Dateien in Powershell arbeiten zu können, muss man das vorangestellte PowerShell-XML-Objektadapter [xml]$VariablenName definieren.
Die Variable wird als .NET-Klasse – System.Xml.XmlDocument deklariert. Zu finden mit:
1 |
$xmlfile | Get-Member |
1 2 3 4 5 6 7 8 9 10 11 |
##XML-Datei wird in folgende Variable geladen [xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml ##serverliste3_template.xml aus dem Download ##Informationen aus der XML-Datei auslesen $xmlfile.firma $xmlfile.firma.land $xmlfile.firma.land.standorte $xmlfile.firma.land.standorte.standort $xmlfile.firma.land.standorte.standort.server $xmlfile.firma.land.standorte.standort.server.hostname $xmlfile.firma.land.standorte.standort.server.FQDN |
1 2 3 4 5 |
##Die Land/Standorte/Server mit der Abfrage eingrenzen $xmlfile.firma.land $xmlfile.firma.land[0] $xmlfile.firma.land[1] |
1 2 3 4 5 6 7 |
$xmlfile.firma.land[0].standorte.standort $xmlfile.firma.land[0].standorte.standort[0] $xmlfile.firma.land[0].standorte.standort[1] $xmlfile.firma.land[0].standorte.standort[0].server.FQDN $xmlfile.firma.land[0].standorte.standort[1].server.FQDN $xmlfile.firma.land[0].standorte.standort.server[0].FQDN $xmlfile.firma.land[0].standorte.standort.server[1].FQDN |
1 2 3 4 5 |
$xmlfile.firma.land.standorte[1].standort.server.FQDN $xmlfile.firma.land.standorte.standort[2].server.FQDN $xmlfile.firma.land.standorte.standort[3].server.FQDN $xmlfile.firma.land.standorte.standort.server[1].FQDN $xmlfile.firma.land.standorte.standort.server[2].FQDN |
Um jetzt die Informationen von so einer XML-Datei nutzen zu können, habe ich hier mal zwei Abfragen gebaut, um meine Server anpingen zu können.
1 2 3 4 5 6 7 8 9 10 11 12 |
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml Clear-Host $PingMachines = $xmlfile.firma.land.standorte.standort.server.FQDN ForEach($MachineName In $PingMachines) {$PingStatus = Gwmi Win32_PingStatus -Filter "Address = '$MachineName'" | Select-Object StatusCode if ($PingStatus.StatusCode -eq 0) {Write-Host $MachineName -Fore "Green"} else {Write-Host $MachineName -Fore "Red"}} |
1 2 3 4 5 6 7 8 9 10 11 12 |
$path = D:\PowershellScripte\Powershell_XML [xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml Clear-Host $PingMachines = $xmlfile.firma.land.standorte.standort.server | Foreach-Object {$_.'FQDN'} | Foreach-Object { if (Test-Connection $_ -quiet -count 1){ " " + $_ | out-file "$path\Ping_Success.txt" -append } else { " " + $_ | out-file "$path\Ping_NotSuccess.txt" -append } } |
Temporäre Änderung einer XML Struktur
1 2 3 4 5 6 7 8 9 10 11 12 |
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml $xmlfile.firma.land.standorte[0].standort.server[0] | ForEach-Object {if ($_.FQDN -like "ADS01.de.htdom.local") {$_.FQDN = "ADS01.htdom.local" } if ($_.Domain -like "de.htdom.local") {$_.Domain = "htdom.local" } } $xmlfile.firma.land.standorte[0].standort.server |
Server Liste erstellen lassen – sortiert nach IP Adressen
1 2 3 |
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml $xmlfile.firma.land.standorte.standort.server | Where-Object {$_."IP-Address" -gt "192.168.178.1"} | Sort-Object IP-Address | Format-Table FQDN,IPAddress,SubnetMask,Gateway,DNSServer1,DNSServer2,WINSServer -AutoSize |
Servername + Domainname zusammenstellen lassen
1 2 3 |
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml $xmlfile.firma.land.standorte.standort.server | ForEach-Object{$_.Hostname + "." + $_.Domain} | Sort-Object $_.Hostname |
Servereinträge in einer XML-Datei clonen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[xml]$xmlfile = Get-Content .[Pfad zur XML-Datei]\serverliste3.xml $newsrv = $xmlfile.firma.land.standorte.standort[0].server.Clone() $newsrv.Hostname = "ADS03" $newsrv.FQDN = "ADS03.htdom.local" $newsrv.IPAddress = "192.168.178.102" $newsrv.DNSServer2 = "192.168.178.102" $newsrv.Memory = "3072 MB" $newsrv.CPartition = "50 GB" $newsrv.DPartition = "100 GB" $newsrv.OS = "Windows Server 2012 R2 x64" $newsrv.ServicePack = "-" $newsrv2 = $xmlfile.firma.land.standorte.standort[0].server.Clone() $newsrv2.Hostname = "ADS04" $newsrv2.FQDN = "ADS04.htdom.local" $newsrv2.IPAddress = "192.168.178.103" $newsrv2.DNSServer2 = "192.168.178.103" $newsrv2.Memory = "3072 MB" $newsrv2.CPartition = "50 GB" $newsrv2.DPartition = "100 GB" $newsrv2.OS = "Windows Server 2012 R2 x64" $newsrv2.ServicePack = "-" $xmlfile.firma.land.standorte.standort[0].AppendChild($newsrv) $xmlfile.firma.land.standorte.standort[0].AppendChild($newsrv2) $xmlfile.save("D:\PowershellScripte\Powershell_XML\test.xml") |
So das was erst mal wieder von mir.
Viele Spaß beim ausprobieren.
Gruß Helmut