Office Logo

Kopieren von SharePoint Listen mit PnP-PowerShell​

Im heutigen Artikel geht es darum wie man ganz einfach mithilfe von PowerShell ganze Listen kopieren kann. Aber bevor du jetzt denkst „Ich bin doch kein Entwickler und habe keine Ahnung von PowerShell“ dem sei gesagt „Keine Angst wir gehen das Ganze ganz einfach und verständlich an“.  Ich zeige dir wie du in den nächsten Zeilen, Schritt für Schritt diese Herausforderung meistern kannst! Für ungeduldige gibt es am Ende des Artikels das ganze Skript 😉

Kommen wir zunächst zum eigentlichen Problem: Du hast eine oder mehrere Listen mit den verschiedensten Metadaten, Ansichten und Co. in einer SharePoint Seite und die möchtest du 1:1 ohne Inhalt in eine neue Seite kopieren. Hierfür willst du natürlich so wenig manuellen Aufwand wie nur möglich betreiben. Für diesen Zweck bietet sich daher PowerShell an. PowerShell ist eine Skriptsprache von Microsoft um im Zusammenhang mit SharePoint bestimmte Tätigkeiten zu Automatisieren. Also perfekt um das Kopieren von Listen zu (teil-)automatisieren. 

Aber warum sollte ich Beispielsweise PowerShell verwenden, wenn ich doch z.B. die SharePoint eigene Funktionalität nutzen kann um Listen zu kopieren? Der Einfache Grund ist, dass mithilfe von PowerShell und das erzeugten Templates mehr Informationen kopiert werden können, das bedeutet im Zusammenhang mit Listen, dass z.B. Berechtigungen und erweiterte Einstellungen kopiert werden. Zum anderen bietet die Möglichkeit auch nicht nur Listen sondern ganze Seiten zu kopieren oder mithilfe des erzeugten Templates ein Provisionierungssystem aufzubauen.

Natürlich habe ich hier noch ein paar nützliche Links parat um sich mehr in das Thema einzulesen:

Vorbereitung

Beginnen wir zunächst damit, das Werkzeug zu öffnen mit dem wir PowerShell ausführen können. Dazu verwenden wir die Windows PowerShell Integrated Scripting Environmet oder kurz ISE. Dazu gehen verwenden wir am besten die Windows Suche (Shortcut Win+S) und tippen „ISE“ ein und klicken per rechtsklick auf die App „Windows PowerShell ISE“ und wählen dann „Als Administrator ausführen“ aus. Dies ist notwendig um das PnP-Framework zu installieren mit dem das kopieren von Listen ermöglicht wird. 
Als nächstes öffnet sich die Applikation.

Nun installieren wir das PnP-Framework mit folgendem Befehl:

1 Install-Module SharePointPnPPowerShellOnline

Mit diesem Befehl wird das benötigte Framework heruntergeladen und auf dem Rechner installiert. Während der Installation kann sich ein Fenster öffnen bei dem mit „Ja, für alle“ bestätigt werden muss. Nach erfolgreicher Installation sind wir nun Einsatzbereit um Listen aus SharePoint zu kopieren.

Kopieren von Listen

Schritt 1:
Nachdem nun die Vorbereitungen abgeschlossen sind, kommen wir nun zum eigentlichen Teil dem kopieren von Listen.
Zunächst müssen wir sogenannte Variablen mit Werten befüllen wie der Quellseite (Zeile 1), der Zielseite (Zeile 2) und wo das sogenannte Template (Zeile 3) der Liste gespeichert werden soll. Hierfür verwenden wir folgenden Code:

1 $SourceSite  = "<Bitte Url der Quellseite eingeben (z.B. https://Domain.sharepoint.com/sites/Quellseite)>"
2 $Targetsite = "<Bitte Url der Zielseite eingeben (z.B. https://Domain.sharepoint.com/sites/Zielseite)>"
3 $TemplateUrl = "<Bitte Pfad eigeben an welcher Stelle das Template gespeichert werden soll (z.B. C:\Users\XYZ\Documents\)>"

Diese 3 Zeilen kopieren wir nun und fügen sie in den oberen Teil der ISE ein. Mit diesen 3 Zeilen werden wir nachher die Quell- und Zielurl, sowie den Pfad zum
Template spezifizieren. Der Inhalt wird innerhalb der Anführungszeichen eingetragen z.B. 

1 $SourceSite  = "https://DeineDomain.sharepoint.com/sites/Quellseite"

Schritt 2:
Im nächsten Schritt wird eine Verbindung zur SharePoint Seite hergestellt aus der wir die Liste kopieren möchten. Das geschieht mit dem folgenden Befehl:

1 Connect-PnPOnline -Url $SourceSite -UseWebLogin

Dieser Befehl ist dazu, da um sich mit der SharePoint Seite, die wir in der Variable $SourceSite eingegeben und gespeichert wurde zu verbinden. Mithilfe des Parameters -UseWebLogin verwenden wir die online Authentifizierung (beispielsweise um MFA zu Verwenden falls aktiv).

Nun haben wir zwei Möglichkeiten. Das kopieren aller Listen (+Bibliotheken)  der Seite oder einer einzelnen Liste.

 

Alle Listen

Zunächst behandeln wir die Möglichkeit alle Listen zu kopieren. Nachdem wir nun die Variablen vorbereitet haben und mithilfe von „Connect-PnPOnline“ eine Verbindung aufgebaut haben. Verwenden wir nun den Befehl „Get-PnPProvisioningTemplate“  um einen Auszug aller Listen zu erhalten und diese in Form eines Templates zu speichern. Dazu verwenden wir folgende Zeilen: 

1 $Template = Get-PnPProvisioningTemplate -OutputInstance -Handlers Lists
2 Save-PnPProvisioningTemplate -InputInstance $Template -Out $TemplateUrl

Die erste Zeile ruft die Methode Get-PnPProvisioningTemplate auf und Filter mithilfe des Parameters -Handlers Lists alle Listen und gibt diese als Template aus und speichert sie in der Variable $Template. In der nächsten Zeile wird dann dieses Template mit dem Befehl Save-PnPProvisioningTemplate unter dem Pfad, der vorhin in der Variable $TemplateUrl festgelegt wurde, gespeichert.

Nun haben wir ein Template aller Listen und können dieses Template verwenden um es auf einer anderen Seite zu verwenden. Das geschieht nun in den nächsten zwei Zeilen:

1 Connect-PnPOnline -url $Targetsite -UseWebLogin
2 Apply-PnPProvisioningTemplate -Path $TemplateUrl

 

Zum einen verbinden wir uns erneut mit dem Befehl Connect-PnPOnline mit der Zielseite ($Targetsite) und verwenden das eben erstellt Template mit dem Befehl Apply-PnPProvisioningTemplate. Damit werden nun alle Listen anhand des Schemas im Template ($TemplateUrl)auf der neuen Seite erstellt, dass 1:1 dem original entspricht.

Eine einzelne Liste

Als Alternative zu der Methoden oben bei der alle Listen kopiert werden, gibt es auch nicht Möglichkeit eine einzelne Liste zu kopieren. Hierfür wird zunächst oben eine weitere Variable erstellt. In dieser wird nun der Name der zu kopierende Liste eingegeben.

1 $SourceSite  = "<Bitte Url der Quellseite eingeben (z.B. https://Domain.sharepoint.com/sites/Quellseite)>"
2 $Targetsite = "<Bitte Url der Zielseite eingeben (z.B. https://Domain.sharepoint.com/sites/Zielseite)>"
3 $TemplateUrl = "<Bitte Pfad eigeben an welcher Stelle das Template gespeichert werden soll (z.B. C:\Users\XYZ\Documents\)>"
4 $ListName = "<Name der Liste die migriert werden soll (z.B. Testliste)>"

Als nächstes wird dann zwischen den bereits verwendeten Zeilen 1 und 7, drei weitere Zeilen eingebaut:

1 $Template = Get-PnPProvisioningTemplate -OutputInstance -Handlers Lists
2 
3 $ListTemplate = $Template.Lists | Where-Object { $_.Title -eq $ListName }
4 $Template.Lists.Clear()
5 $Template.Lists.Add($ListTemplate)
6
7 Save-PnPProvisioningTemplate -InputInstance $Template -Out $TemplateUrl

In Zeile 3 wird nun aus dem Template eine einzelne Liste mit dem in der Variable $ListName festgelegten Namen herausgefiltert und in der Variable XY zwischengespeichert.  In Zeile 4 wird nun das Template geleert. Anschließend wird in Zeile 5 der Inhalt auf der Variable $ListTemplate in die Variable $Template zurück gespeichert um dann in Zeile 7 ein fertiges Template zu erzeugen. Nun kann dieses Template wieder mit folgenden Befehlen auf der neuen Seite verwendet werden:

1 Connect-PnPOnline -url $Targetsite -UseWebLogin
2 Apply-PnPProvisioningTemplate -Path $TemplateUrl
 
Mit diesen beiden Möglichkeiten könnt ihr nun ganz einfach mithilfe von PowerShell alle oder einzelne Liste kopieren. 
 

Ganzer Code

Alle Listen:

1  $SourceSite  = "<Bitte Url der Quellseite eingeben (z.B. https://Domain.sharepoint.com/sites/Quellseite)>"
2 $Targetsite = "<Bitte Url der Zielseite eingeben (z.B. https://Domain.sharepoint.com/sites/Zielseite)>"
3 $TemplateUrl = "<Bitte Pfad eigeben an welcher Stelle das Template gespeichert werden soll (z.B. C:\Users\XYZ\Documents\)>"
4 $ListName = "<Name der Liste die migriert werden soll>"
5 6 Connect-PnPOnline -Url $SourceSite -UseWebLogin
7 8 $Template = Get-PnPProvisioningTemplate -OutputInstance -Handlers Lists
9 Save-PnPProvisioningTemplate -InputInstance $Template -Out $TemplateUrl
10 11 Connect-PnPOnline -url $Targetsite -UseWebLogin
12 Apply-PnPProvisioningTemplate -Path $TemplateUrl
 

Einzelne Listen:

1  $SourceSite  = "<Bitte Url der Quellseite eingeben (z.B. https://Domain.sharepoint.com/sites/Quellseite)>"
2 $Targetsite = "<Bitte Url der Zielseite eingeben (z.B. https://Domain.sharepoint.com/sites/Zielseite)>"
3 $TemplateUrl = "<Bitte Pfad eigeben an welcher Stelle das Template gespeichert werden soll (z.B. C:\Users\XYZ\Documents\)>"
4 $ListName = "<Name der Liste die migriert werden soll>"
5 6 Connect-PnPOnline -Url $SourceSite -UseWebLogin
7 8 $Template = Get-PnPProvisioningTemplate -OutputInstance -Handlers Lists
9 $ListTemplate = $Template.Lists | Where-Object { $_.Title -eq $ListName }
10 $Template.Lists.Clear()
11 $Template.Lists.Add($ListTemplate)
12 Save-PnPProvisioningTemplate -InputInstance $Template -Out $TemplateUrl
13 14 Connect-PnPOnline -url $Targetsite -UseWebLogin
15 Apply-PnPProvisioningTemplate -Path $TemplateUrl

Hoffentlich konnte euch der kleine Einblick in die Welt von PowerShell helfen und konntet bereits eure ersten Listen kopieren. 

Viel Erfolg und solltet ihr Probleme oder Fragen haben, dann meldet euch in den Kommentaren 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.