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

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

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

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

to

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

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

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

Могу я здесь чем-нибудь помочь, пожалуйста?


person markrwdn    schedule 10.12.2020    source источник


Ответы (1)


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

#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.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

BR

person Baker_Kong    schedule 11.12.2020
comment
Спасибо за ваш ответ! К сожалению, я не могу обработать кредиты, так как использую MFA со своей учетной записью администратора; Я попытался заменить «Get-Credentials» на «-UseWebLogin», но не уверен, анализируются ли имя пользователя и пароль так, как они должны быть для «$ Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials ($ Cred.Username, $ Cred.Password) '. - person markrwdn; 11.12.2020
comment
Вы можете использовать $ ctx = Get-PnPContext - person Baker_Kong; 11.12.2020