# Start-SPMigration PowerShell-Skript fuer die Migration von SharePoint On-Premise Inhalten ueber das serverseitige Objektmodell. Das Skript kann: - Dokumentbibliotheken exportieren - Dateien inklusive Metadaten exportieren - normale SharePoint-Listen und deren Eintraege exportieren - exportierte Inhalte wieder in ein Ziel-Web importieren - Feldwerte ueber eine Mapping-CSV von Quell- auf Ziel-InternalNames abbilden - Listen- und Bibliotheksnamen ueber `manifest.csv` auf Zielnamen abbilden ## Voraussetzungen - SharePoint On-Premise Server - Ausfuehrung auf einem Server mit installiertem SharePoint PowerShell-Modul - Berechtigungen auf Quell- und Ziel-Web - PowerShell mit Zugriff auf `SharePointServer` Das Skript laedt intern: ```powershell Import-Module SharePointServer ``` ## Dateien im Projekt - `Start-SPMigration.ps1`: Hauptskript fuer Export und optionalen Import - `FieldMapping.sample.csv`: Beispiel fuer das Feldmapping ## Exportierte Struktur Beim Export entsteht unter `-OutputPath` folgende Struktur: ```text OutputPath |-- Files | |-- | | |-- Unterordner | | | |-- Dokument.pdf | | | |-- Dokument.pdf.properties.json |-- Lists | |-- ListeA.json |-- manifest.csv ``` ### Dateien - Die Originaldatei wird in `Files\\...` gespeichert. - Die Metadaten liegen direkt daneben als Sidecar-Datei: `Dateiname.ext.properties.json` - `manifest.csv` enthaelt ausserdem Container-Eintraege fuer Listen und Dokumentbibliotheken ### Listen - Pro Liste wird genau eine JSON-Datei unter `Lists\` erzeugt. - Die Eintraege enthalten insbesondere: - `ContentTypeId` - `FieldValues` - `FieldTextValues` - `Fields` ## Wichtige Metadaten Fuer den Import sind vor allem diese Informationen relevant: - `FieldValues` - `FieldTextValues` - `ContentTypeId` - interne Feldnamen (`InternalName`) Der Name des Inhaltstyps wird bewusst nicht als fuehrende Importinformation verwendet, da er sich im Zielsystem unterscheiden kann. ## Mapping-CSV Format: ```csv SourceInternalName;TargetInternalName DHS2016Persdat;Persdat DHS2016Dienstgrad;Dienstgrad DHS2016SecurityClearance;SecurityClearance ``` Bedeutung: - `SourceInternalName`: interner Feldname aus dem Export - `TargetInternalName`: interner Feldname im Zielsystem ## manifest.csv fuer Listen- und Bibliotheksmapping Beim Export wird fuer jede Liste und jede Dokumentbibliothek eine Container-Zeile in `manifest.csv` geschrieben. Wichtige Spalten: - `RecordType` - `ObjectType` - `SourceTitle` - `TargetTitle` - `BaseTemplate` Fuer das Mapping ist insbesondere `TargetTitle` gedacht: - leer: das Skript sucht im Ziel mit dem Quellnamen - gesetzt: das Skript sucht im Ziel mit dem Wert aus `TargetTitle` Beispiel: ```csv RecordType;ObjectType;SourceWebUrl;SourceTitle;TargetTitle;BaseType;BaseTemplate;RootFolderUrl;SourceServerRelativeUrl;FileName;FileUniqueId;FileLength;LocalFilePath;LocalMetadataPath;ExportedAtUtc Container;DocumentLibrary;http://clshp001/;Documents;Dokumente;DocumentLibrary;101;/Documents;/Documents;;;;;; Container;List;http://clshp001/;TestListe;ZielTestListe;GenericList;100;/Lists/TestListe;/Lists/TestListe;;;;;; ``` Wenn eine Ziel-Liste oder Ziel-Bibliothek nicht existiert, gibt das Skript eine Warnung aus, dass dieser Container manuell angelegt werden soll. ## Parameter ### Pflichtparameter - `WebUrl`: Quell-Web fuer den Export - `OutputPath`: Ausgabeordner fuer den Export ### Exportparameter - `IncludeHiddenLibraries`: exportiert auch versteckte Bibliotheken - `IncludeHiddenLists`: exportiert auch versteckte Listen - `ExportOnly`: fuehrt nur den Export aus - `ImportOnly`: fuehrt nur den Import aus einem vorhandenen Exportordner aus ### Importparameter - `TargetWebUrl`: Ziel-Web fuer den Import - `MappingCsvPath`: CSV fuer Feldmapping - `ImportFiles`: importiert nur Dateien/Bibliotheken - `ImportLists`: importiert nur Listen - `OverwriteFiles`: ueberschreibt vorhandene Dateien beim Import Hinweis: - Wenn weder `ImportFiles` noch `ImportLists` gesetzt sind, werden beim Import beide Bereiche verarbeitet. - Wenn `ExportOnly` gesetzt ist, wird kein Import gestartet. - Wenn `ImportOnly` gesetzt ist, wird kein neuer Export gestartet. ## Beispiele ### Nur Export ```powershell .\Start-SPMigration.ps1 ` -WebUrl "http://sharepoint/sites/Quelle" ` -OutputPath "C:\Temp\SP-Export" ` -ExportOnly ``` ### Export und danach Import ```powershell .\Start-SPMigration.ps1 ` -WebUrl "http://sharepoint/sites/Quelle" ` -OutputPath "C:\Temp\SP-Export" ` -TargetWebUrl "http://sharepoint/sites/Ziel" ` -MappingCsvPath ".\FieldMapping.sample.csv" ``` ### Export, manifest.csv anpassen, dann nur Import ```powershell .\Start-SPMigration.ps1 ` -WebUrl "http://sharepoint/sites/Quelle" ` -OutputPath "C:\Temp\SP-Export" ` -ExportOnly ``` Danach `manifest.csv` bearbeiten und `TargetTitle` fuer Listen oder Bibliotheken setzen. Anschliessend: ```powershell .\Start-SPMigration.ps1 ` -OutputPath "C:\Temp\SP-Export" ` -TargetWebUrl "http://sharepoint/sites/Ziel" ` -MappingCsvPath ".\FieldMapping.sample.csv" ` -ImportOnly ``` ### Nur Dateien importrelevant ausfuehren ```powershell .\Start-SPMigration.ps1 ` -WebUrl "http://sharepoint/sites/Quelle" ` -OutputPath "C:\Temp\SP-Export" ` -TargetWebUrl "http://sharepoint/sites/Ziel" ` -MappingCsvPath ".\FieldMapping.sample.csv" ` -ImportFiles ` -OverwriteFiles ``` ### Nur Listen importrelevant ausfuehren ```powershell .\Start-SPMigration.ps1 ` -WebUrl "http://sharepoint/sites/Quelle" ` -OutputPath "C:\Temp\SP-Export" ` -TargetWebUrl "http://sharepoint/sites/Ziel" ` -MappingCsvPath ".\FieldMapping.sample.csv" ` -ImportLists ``` ## Aktuelles Verhalten beim Import ### Dokumentbibliotheken - Dateien werden in die per `manifest.csv` aufgeloeste Zielbibliothek importiert. - Unterordner werden bei Bedarf angelegt. - Metadaten werden anschliessend ueber das CSV-Mapping gesetzt. ### Listen - Listeneintraege werden neu angelegt. - Feldwerte werden ueber `FieldValues` und `FieldTextValues` gemappt. ## Bekannte Einschraenkungen - Die Zielaufloesung kann ueber `manifest.csv` mit `TargetTitle` ueberschrieben werden. - Listenanhaenge werden derzeit noch nicht physisch mit importiert. - Ordner in normalen Listen werden beim Import derzeit uebersprungen. - Fehlende Ziellisten oder Zielbibliotheken werden derzeit nicht automatisch angelegt; das Skript gibt stattdessen eine Warnung zur manuellen Anlage aus. - Sehr spezielle Feldtypen koennen je nach Farm-Konfiguration zusaetzliche Anpassungen benoetigen. - Das Skript ist fuer SharePoint On-Premise mit serverseitigem Objektmodell gedacht, nicht fuer SharePoint Online. ## Empfehlung Zuerst immer mit `-ExportOnly` testen und die exportierten `*.properties.json` sowie die Listen-JSONs pruefen. Danach das Feldmapping vervollstaendigen und erst dann den kombinierten Export/Import gegen das Zielsystem laufen lassen.