PowerShell script to copy SharePoint Online library with content types, fields and custom permission levels
This PowerShell script can be used to copy a SharePoint Online library, along with its content types, fields, groups, and custom permission levels, from a source site to a destination site. The script also copies the items from the source library to the destination library, along with their metadata and permissions.
PowerShellScript SharePointOnline ContentTypes Fields PermissionLevels
// Connect to SharePoint Online site $sourceSiteUrl = "https://SourceSiteUrl.sharepoint.com" $destinationSiteUrl = "https://DestinationSiteUrl.sharepoint.com" Connect-SPOService -Url $sourceSiteUrl Connect-SPOService -Url $destinationSiteUrl // Set variables for the source and destination libraries $sourceLibraryTitle = "Source Library Title" $destinationLibraryTitle = "Destination Library Title" // Get the source list and items $sourceList = Get-SPOList -Identity $sourceLibraryTitle -Includes Fields, ContentTypes $sourceItems = Get-SPOListItem -List $sourceLibraryTitle -Limit All -Includes RoleAssignments, HasUniqueRoleAssignments, Folder, FieldValuesAsHtml // Create the destination library if it doesn't exist if (!(Get-SPOList -Identity $destinationLibraryTitle -ErrorAction SilentlyContinue)) { New-SPOList -Title $destinationLibraryTitle -Template DocumentLibrary } $destinationList = Get-SPOList -Identity $destinationLibraryTitle -Includes Fields, ContentTypes // Copy the content types from the source to the destination foreach ($ct in $sourceList.ContentTypes) { $destCT = Get-SPOContentType -Name $ct.Name -List $destinationList if (!$destCT) { Add-SPOContentTypeToList -List $destinationList -ContentType $ct.Name } } // Copy the fields from the source to the destination foreach ($field in $sourceList.Fields) { $destField = Get-SPOField -Identity $field.InternalName -List $destinationList -ErrorAction SilentlyContinue if (!$destField) { Add-SPOField -List $destinationList -DisplayName $field.Title -InternalName $field.InternalName -Type $field.TypeAsString -Required $field.Required } } // Copy the SharePoint groups from the source to the destination $sourceGroups = Get-SPOGroup -Site $sourceSiteUrl foreach ($group in $sourceGroups) { $destinationGroup = Get-SPOGroup -Site $destinationSiteUrl -Identity $group.LoginName if (!$destinationGroup) { New-SPOGroup -Site $destinationSiteUrl -Name $group.Title -Description $group.Description } } // Copy the custom permission levels from the source to the destination $sourcePermissionLevels = Get-SPOPermissionLevel -Site $sourceSiteUrl foreach ($level in $sourcePermissionLevels) { $destinationLevel = Get-SPOPermissionLevel -Site $destinationSiteUrl -Identity $level.Name if (!$destinationLevel) { New-SPOPermissionLevel -Site $destinationSiteUrl -Name $level.Name -Description $level.Description -BasePermissions $level.BasePermissions } } // Copy the items from the source to the destination foreach ($sourceItem in $sourceItems) { // Copy the item to the destination library $itemUrl = $sourceItem.FieldValuesAsHtml.FileRef.Split(",")[0] $targetUrl = $destinationList.RootFolder.ServerRelativeUrl + "/" + $itemUrl.Split("/")[-1] Copy-SPOFile -SourceUrl $itemUrl -TargetUrl $targetUrl -Force // Set the metadata on the destination item $destinationItem = Get-SPOListItem -List $destinationLibraryTitle -ItemId $sourceItem.Id foreach ($field in $sourceItem.FieldValues.Keys) { if ($field -ne "ID" -and $field -ne "Created" -and $field -ne "Author" -and $field -ne "Modified" -and $field -ne "Editor") { $destinationItem[$field] = $sourceItem[$field] } } $destinationItem.Update() // Set the permissions on the destination item $sourceItemUrl = $sourceItem.FieldValuesAsHtml.FileRef.Split(",")[0] $sourceItemPermission = Get-SPOUserEffectivePermissions -Site $sourceSiteUrl -User $sourceItem["Editor"] -WebRelativeUrl $sourceItemUrl $destinationItemUrl = $destinationItem.FieldValuesAsHtml.FileRef.Split(",")[0] $destinationItemPermission = $null // Create the SharePoint group if it doesn't exist in the destination site $sourceItemEditorsGroup = Get-SPOGroup -Site $sourceSiteUrl -Identity $sourceItemPermission.Groups[0].LoginName -ErrorAction SilentlyContinue $destinationItemEditorsGroup = Get-SPOGroup -Site $destinationSiteUrl -Identity $sourceItemPermission.Groups[0].LoginName -ErrorAction SilentlyContinue if (!$destinationItemEditorsGroup) { New-SPOGroup -Site $destinationSiteUrl -Name $sourceItemPermission.Groups[0].Title -Description $sourceItemPermission.Groups[0].Description } // Set the permission level on the destination item $sourceItemEditorsGroup = Get-SPOGroup -Site $sourceSiteUrl -Identity $sourceItemPermission.Groups[0].LoginName $destinationItemEditorsGroup = Get-SPOGroup -Site $destinationSiteUrl -Identity $sourceItemPermission.Groups[0].LoginName $permissionLevels = Get-SPOPermissionLevel -Site $sourceSiteUrl foreach ($level in $permissionLevels) { if ($sourceItemPermission.RoleAssignments.RoleDefinitionBindings.Name -contains $level.Name) { $destinationPermissionLevel = Get-SPOPermissionLevel -Site $destinationSiteUrl -Identity $level.Name Set-SPOListItemPermission -List $destinationList -ItemId $destinationItem.Id -Group $destinationItemEditorsGroup -PermissionLevel $destinationPermissionLevel break } } }
Comments