#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