SharePoint Online: obtener elementos de la lista de la carpeta usando PowerShell
Requisito: Obtener todos los elementos de la lista de una carpeta en SharePoint Online.
SharePoint Online: PowerShell para obtener elementos de lista en una carpeta
Obtener todos los elementos de la carpeta de lista de SharePoint es un requisito común cuando se trabaja con scripts de modelo de objetos del lado del cliente. En esta publicación de blog, veremos cómo puede usar PowerShell para obtener elementos de la lista de una carpeta en particular. También veremos cómo exportar el contenido de la carpeta a un archivo CSV. Esto puede resultar especialmente útil si necesita recopilar información rápidamente de una carpeta específica en SharePoint Online. ¡Empecemos!
Aquí está el CSOM de SharePoint para obtener elementos de carpeta:
#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 Get-ListItemsFromFolder()
{
param
(
[Parameter(Mandatory=$true)] [string] $SiteURL,
[Parameter(Mandatory=$true)] [string] $ListName,
[Parameter(Mandatory=$true)] [string] $FolderURL
)
Try {
#Setup Credentials to connect
$Cred = Get-Credential
$Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Cred
#Get the list
$List=$Ctx.Web.Lists.GetByTitle($ListName)
#Frame CamlQuery to retrieve the items from the Folder
$CAMLQuery= New-Object Microsoft.SharePoint.Client.CamlQuery
#Set relative URL of the folder
$CAMLQuery.FolderServerRelativeUrl=$FolderURL
#Get List Items from the Folder
$ListItems=$List.GetItems($CAMLQuery)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
Write-host "Total Number of Items Found:"$ListItems.Count
#Iterate through all list items
Foreach($Item in $ListItems)
{
#Get Ids for each Item
Write-Host $item["ID"]
}
}
Catch {
write-host -f Red "Error Getting List Items from Folder!" $_.Exception.Message
}
}
#Set Parameter Values
$SiteURL="https://crescent.sharepoint.com"
$ListName="Projects"
#Relative URL to the Folder - For Libraries, E.g: "/Documents/2018" or "/sites/sales/documents/projects/active"
$FolderURL="/Lists/Projects/Active"
#Call the function to get list items from folder
Get-ListItemsFromFolder -SiteURL $SiteURL -ListName $ListName -FolderURL $FolderURL
Este PowerShell de SharePoint Online obtiene todos los elementos de la carpeta. Si desea obtener todos los archivos de una biblioteca de documentos, use: PowerShell para obtener una lista de archivos en la biblioteca de documentos en SharePoint Online
Para obtener todos los archivos y carpetas de una carpeta determinada, debe configurar el alcance de la vista. De lo contrario, obtiene todos los archivos y carpetas SOLO de la ubicación de la carpeta indicada y nada de lo que se encuentra debajo.
$CAMLQuery.ViewXml = "<View Scope='RecursiveAll' /><Where><Eq><FieldRef Name='ServerRelativeUrl'/><Value Type='Text'>/Documents/Archived/2018</Value></Eq></Where>";
SharePoint Online: obtener todos los elementos de una carpeta mediante PnP PowerShell
Aquí está el CAML de SharePoint para obtener elementos en una carpeta:
#Config Variables
$SiteURL = "https://Crescent.sharepoint.com"
$ListName = "Projects"
$FolderRelativeURL= "/Lists/Projects/2018"
#Get Credentials to connect
$Cred = Get-Credential
Try {
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Credentials $Cred
#Get All Items from the Folder
$CAMLQuery = "<View Scope='RecursiveAll'><Query><Where><Eq><FieldRef Name='FileDirRef'/><Value Type='Text'>$FolderRelativeURL</Value></Eq></Where></Query></View>"
$FolderItems = Get-PnPListItem -List $ListName -Query $CAMLQuery
Write-host "Total Number of Items in the Folder:" $FolderItems.Count
ForEach($Item in $FolderItems)
{
Write-host $Item["Title"]
}
}
catch {
write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}
También puede usar el cmdlet Get-PnPFolderItem con la URL de la carpeta para recuperar todos los elementos de una carpeta o subcarpeta:
Get-PnPFolderItem -FolderSiteRelativeUrl "/Shared Documents/New"
Obtener todos los archivos y carpetas de una carpeta de forma recursiva
Es posible que encuentre un problema de superación del umbral de vista de lista cuando trabaje con listas y bibliotecas más grandes, ya que Get-PnPFolderItem no tiene el parámetro "Pagesize". Como resultado, es posible que obtenga un mensaje "Get-PnPFolderItem: el intento de operación está prohibido porque excede el umbral de vista de lista". error. Entonces, aquí está el truco para obtener todos los elementos de una carpeta de forma recursiva:
#Set Parameters
$SiteURL = "https://Crescent.sharepoint.com/sites/marketing"
$FolderServerRelativeURL = "/Sites/Marketing/Shared Documents/New"
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
#Get the Folder to download
$Folder = Get-PnPFolder -Url $FolderServerRelativeURL -Includes ListItemAllFields.ParentList
#Get the Parent List
$List = $Folder.ListItemAllFields.ParentList
#Get all Items from the folder - with progress bar
$global:counter = 0;
$ListItems = Get-PnPListItem -List $List -PageSize 500 -Fields FileLeafRef -ScriptBlock { Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete `
($global:Counter / ($List.ItemCount) * 100) -Activity "Getting Items from List:" -Status "Processing Items $global:Counter to $($List.ItemCount)";} | Where {$_.FieldValues.FileRef -like "$($FolderServerRelativeUrl)*"}
Write-Progress -Activity "Completed Retrieving Items from Folder $FolderServerRelativeURL" -Completed
#Get All Files and Folders from the Folder Recursively
$ListItems | ForEach-Object {
Write-host $_.FieldValues.FileRef
}
PowerShell para obtener el inventario de todos los archivos y carpetas de una carpeta
¿Qué tal generar un informe de inventario (CSV) de todos los archivos y carpetas de una carpeta determinada en SharePoint Online?
#Config Variables
$SiteURL = "https://crescent.sharepoint.com/sites/Funds"
$ListName ="Funds"
$FolderServerRelativePath = "/sites/Funds/NeoFunds/EAEF IV*" #Any file under the given path
$ReportOutput = "C:\Temp\EAEFIV-Inventory.csv"
$Pagesize = 500
#Array to store results
$Results = @()
#Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -UseWebLogin
$List = Get-PnPList -Identity $ListName
$global:counter = 0;
$ListItems = Get-PnPListItem -List $ListName -PageSize $Pagesize -Fields Author, Editor, Created, File_x0020_Type -ScriptBlock `
{ Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity `
"Getting Documents from Library '$($List.Title)'" -Status "Getting Documents data $global:Counter of $($List.ItemCount)";} | Where {$_.FieldValues.FileRef -like $FolderServerRelativePath}
$ItemCounter = 0
#Iterate through each item
Foreach ($Item in $ListItems)
{
$Results += New-Object PSObject -Property ([ordered]@{
Name = $Item["FileLeafRef"]
Type = $Item.FileSystemObjectType
FileType = $Item["File_x0020_Type"]
RelativeURL = $Item["FileRef"]
CreatedByEmail = $Item["Author"].Email
CreatedOn = $Item["Created"]
Modified = $Item["Modified"]
ModifiedByEmail = $Item["Editor"].Email
})
$ItemCounter++
Write-Progress -PercentComplete ($ItemCounter / ($ListItems.Count) * 100) -Activity "Exporting data from Documents $ItemCounter of $($ListItems.Count)" -Status "Exporting Data from Document '$($Item['FileLeafRef'])"
}
#Export the results to CSV
$Results | Export-Csv -Path $ReportOutput -NoTypeInformation
Write-host "Folder Inventory Exported to CSV Successfully!" -f Green
Esto coloca todos los elementos en una carpeta en SharePoint Online. Aquí hay otra publicación para obtener archivos de una carpeta de SharePoint Online: Obtener todos los archivos de la carpeta