Im letzten Beitrag zum Thema Inhalts-Editor Webpart (IEWP) und PowerShell habe ich gezeigt, wie man die Inhalte des IEWP per PowerShell konfigurieren kann. Die dabei verwendeten Skripte waren beschränkt auf die Konfiguration eines einzelnen IEWP und beinhalteten keine Behandlung von Ausnahmen.
Im heutigen Beitrag beschäftigen wir uns mit der Behandlung von Ausnahmen sowie der Generalisierung der Konfiguration und schließen die Beitragsreihe ab.
Im Ausnahmefall Sprache zurücksetzen
Um den Inhalt des Inhalts-Editor Webparts (IEWP) sprachabhängig zu setzen haben wir die Regionseinstellungen des aktuellen Threads angepasst. Diese Änderung wirkt sich aber nicht nur auf den Code aus, der den IEWP betrifft, sondern auf alle Befehle, die im Skript darauf folgen.
Wir müssen daher die aktuelle Einstellung sichern und auch wiederherstellen, nachdem die Konfiguration des IEWP abgeschlossen ist:
# Sicherung der aktuellen Regionseinstellungen
$currentUICulture = [System.Threading.Thread]::CurrentThread.CurrentUICulture
$currentCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
try
{ # Code zum Anpassen des IEWP-Inhalts hier
} finally
{ # Regionseinstellungen wiederherstellen
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $currentUICulture
[System.Threading.Thread]::CurrentThread.CurrentCulture = $currentCulture
}
Dieser Code verwendet das aus C# bekannte try-finally-Konstrukt um sicherzustellen, dass die Regionseinstellungen in jedem Fall wiederhergestellt werden, auch wenn bei der Konfiguration des IEWP etwas schief geht.
Das Beispiel soll gleichzeitig daran erinnern, dass auch bei der Konfiguration per PowerShell die in der Softwareentwicklung bewährten Konstrukte wie try-finally, try-catch etc. zum Einsatz kommen können und sollen.
Flexible Konfiguration mit JSON
PowerShell bietet die Möglichkeit, Objekte aus JSON-Beschreibungen zu generieren. Wir machen uns das zunutze, um auf einfache Art ein Konfigurationsobjekt zu erzeugen, mit dem wir beliebig viele IEWP pflegen können.
Das folgende Script definiert Informationen über Web, Seite, Webpart und zu setzende Inhalte in JSON-Notation. Die Inhalte selbst sind in externen Dateien abgelegt.
$jsonConfigString = @"
[
{
"webUrlAbsolute" : "https://www.contoso.de",
"listName" : "Wiki",
"pageFileName" : "Homepage.aspx",
"webPartTypeName" : "ContentEditorWebPart",
"content" :
[
{ "language" : "de-DE",
"filepath" : "C:\\Content-de-DE.txt"
},
{ "language" : "en-US",
"filepath" : "C:\\Content-en-US.txt"
}
]
}
]
"@
Die Umwandlung in ein PowerShell-Objekt ist erfreulich einfach:
$jsonConfig = ConvertFrom-Json $jsonConfigString
Das resultierende PowerShell-Objekt ist ein Array mit genau einem Element und sieht in der Konsole ausgegeben wie folgt aus:
webUrlAbsolute : https://www.contoso.de
listName : Wiki
pageFileName : Homepage.aspx
webPartTypeName : ContentEditorWebPart
content : {@{language=de-DE; filepath=C:\Content-de-DE.txt}, @{language=en-US; filepath=C:\Content-en-US.txt}}
Dieses Objekt nutzen wir nun, um generisch den Inhalt von IEWPs zu setzen. Das folgende Script zeigt stark vereinfacht, wie das funktionieren kann. Die äußere Schleife iteriert die zu bearbeitenden Webparts, die innere Schleife die zu setzenden Sprachen:
$jsonConfig | % {
Write-Host "Verarbeite web $($_.webUrlAbsolute)"
$_.content | % {
Write-Host "Setzte aktuelle Thread-Sprache auf $($_.language)"
$htmlContent = Get-Content "$($_.filepath)"
Write-Host "Setze IEWP-Inhalt aus Datei $($_.filepath) auf $htmlContent"
}
}
Werden nun anstelle der Platzhalter die Codebausteine aus dem letzten Beitrag eingesetzt, dann haben wir eine flexible Methode geschaffen, um beliebige IEWP-Inhalte zu pflegen und die Inhalte dabei außerhalb des PowerShell-Skripts in separaten Dateien zu verwalten und damit die Wartbarkeit zu erhöhen.
Fazit
PowerShell überrascht immer wieder mit interessanten Funktionen, mit denen die Lösung von Problemen rasch von der Hand geht. JSON (oder auch XML)-Objekte sind bspw. schnell erstellt und verarbeitet wie wir heute gesehen haben.
Die Robustheit des Codes sollte man dabei immer im Auge behalten. Die Frage "Was wäre wenn" sollte gestellt und an den richtigen Stellen Ausnahmebehandlung oder Finalisierungs-Skript ergänzt werden.