Копирование содержимого папки Sharepoint (но не фактической папки) в каталог на том же сайте

#powershell #file #sharepoint #sharepoint-online #file-move

#powershell #файл #sharepoint #sharepoint-online #файл-переместить

Вопрос:

Я пытаюсь удалить некоторые ненужные родительские папки с наших сайтов Sharepoint Online в Powershell теперь, когда мы изменили наши политики в отношении хранения файлов. Мы хотим избавиться от ранее существовавшей папки 2020, чтобы минимизировать сложность структуры папок для пользователей при навигации и убедиться, что они не создают папку для 2021 и не копируют туда файлы, занимая пространство Sharepoint.

Таким образом, я хочу извлечь содержимое папки 2020 на всех сайтах наших команд в папку «Общие документы / Общие», а затем удалить пустую папку 2020. Итак, это происходит из

«Общие документы / Общие / 2020 / [все содержимое]»

Для

‘Общие документы / Общие / [все содержимое]’

Функция MovePnP-Folder естественным образом перемещает всю папку, но это сама папка (а не ее содержимое) Я хочу избавиться. Функция MovePnP-File, похоже, работает странным образом и сообщает мне, что у меня нет прав на перемещение файлов, когда я пытаюсь, несмотря на то, что я глобальный администратор. Также, похоже, не работает с подстановочными знаками, которые я ожидал бы использовать для обеспечения выбора всего содержимого папки.

Я надеюсь, что это повторится для всех сайтов Teams в нашей среде.

Могу ли я получить некоторую помощь здесь, пожалуйста?

Ответ №1:

Мы можем перечислять папки и перемещать их файлы / вложенные папки в цикле. Пожалуйста, ознакомьтесь с приведенной ниже демонстрацией:

 #Load SharePoint CSOM Assemblies
Add-Type -Path "C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions16ISAPIMicrosoft.SharePoint.Client.dll"
Add-Type -Path "C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions16ISAPIMicrosoft.SharePoint.Client.Runtime.dll"
  
Function Move-SPOFilesBetweenFolders
{
  param
    (
        [Parameter(Mandatory=$true)] [string] $SiteURL,
        [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.Folder] $SourceFolder,
        [Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.Folder] $TargetFolder
    )
    Try {
        #Write-host "Copying Files from '$($SourceFolder.ServerRelativeUrl)' to '$($TargetFolder.ServerRelativeUrl)'"
        #Get all Files from the source folder
        $SourceFilesColl = $SourceFolder.Files
        $Ctx.Load($SourceFilesColl)
        $Ctx.ExecuteQuery()
  
        #Iterate through each file and move
        Foreach($SourceFile in $SourceFilesColl)
        {
            #Get all files from source Folder
            $SourceFile =$Ctx.Web.GetFileByServerRelativeUrl($SourceFile.ServerRelativeUrl)
            $Ctx.Load($SourceFile)
            $Ctx.ExecuteQuery()
              
            #Move File to destination
            $TargetFileUrl = $SourceFile.ServerRelativeUrl -Replace $SourceFolderURL,$TargetFolderURL
            $SourceFile.MoveTo($TargetFileUrl, [Microsoft.SharePoint.Client.MoveOperations]::Overwrite)
            $Ctx.ExecuteQuery()
  
            Write-host -f Green "File Moved to: "$TargetFileURL
        }
  
        #Process Sub Folders
        $SubFolders = $SourceFolder.Folders
        $Ctx.Load($SubFolders)
        $Ctx.ExecuteQuery()
        Foreach($SubFolder in $SubFolders)
        {
            If($SubFolder.Name -ne "Forms")
            {
                #Prepare Target Folder
                $EnsureFolderURL = $SubFolder.ServerRelativeUrl -Replace $SourceFolderUrl, $TargetFolderUrl
                Try {
                        $Folder=$Ctx.web.GetFolderByServerRelativeUrl($EnsureFolderURL)
                        $Ctx.load($Folder)
                        $Ctx.ExecuteQuery()
                    }
                catch {
                        #Create Folder
                        if(!$Folder.Exists)
                        {
                            $Folder=$Ctx.Web.Folders.Add($EnsureFolderURL)
                            $Ctx.Load($Folder)
                            $Ctx.ExecuteQuery()
                            Write-host "New Folder Created:"$SubFolder.Name -f Yellow
                        }
                    }
                #Call the function recursively to move all files from source folder to target
                Move-SPOFilesBetweenFolders -SiteURL $SiteURL -SourceFolder $SubFolder -TargetFolder $Folder
 
                #Remove the Source Folder
                $SubFolder.Recycle() | Out-Null
                $Ctx.ExecuteQuery()
            }
        }
    }
    Catch {
        write-host -f Red "Error Moving File:" $_.Exception.Message
    }
}
  
#Set Parameter values
$SiteURL="https://abc.sharepoint.com/sites/s01"
$SourceFolderURL ="/sites/s01/My test doc lib/SDK/testlongpath/SPServices"
$TargetFolderURL ="/sites/s01/My test doc lib"
  
#Setup Credentials to connect
$Cred= Get-Credential
  
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
       
#Get the source and Target Folders
$SourceFolder=$Ctx.Web.GetFolderByServerRelativeUrl($SourceFolderURL)
$Ctx.Load($SourceFolder)
$TargetFolder=$Ctx.Web.GetFolderByServerRelativeUrl($TargetFolderURL)
$Ctx.Load($TargetFolder)
$Ctx.ExecuteQuery()
 
#Call the function
Move-SPOFilesBetweenFolders -SiteURL $SiteURL -SourceFolder $SourceFolder -TargetFolder $TargetFolder
 

БР

Комментарии:

1. Спасибо за ваш ответ! К сожалению, я не могу обработать учетные данные, поскольку я использую MFA со своей учетной записью администратора; Я попытался заменить ‘Get-Credentials’ на ‘-UseWebLogin’, но не уверен, что имя пользователя и пароль обрабатываются так, как они должны быть для ‘$ Ctx.Credentials = New-ObjectMicrosoft. SharePoint. Клиент. SharePointOnlineCredentials ($ Cred. Команда Username, $Credit.Password)’.

2. Вы можете использовать $ctx = Get-PnPContext