Skip to content

Instantly share code, notes, and snippets.

@joerodgers
Created May 17, 2024 19:23
Show Gist options
  • Save joerodgers/3e9ad02e10fdda794ee4c912a2fd7b40 to your computer and use it in GitHub Desktop.
Save joerodgers/3e9ad02e10fdda794ee4c912a2fd7b40 to your computer and use it in GitHub Desktop.
Gets the file and folder count for the provided list folder and, optionally, all sub folders.
#requies -modules "PnP.PowerShell"
function Get-FolderChildCount
{
[CmdletBinding()]
param
(
[Parameter(Mandatory=$true)]
[Microsoft.SharePoint.Client.List]
$List,
[Parameter(Mandatory=$true)]
[Microsoft.SharePoint.Client.Folder]
$Folder,
[Parameter(Mandatory=$false)]
[switch]
$Recurse,
[Parameter(Mandatory=$false)]
[switch]
$Detailed
)
begin
{
$overrideParameters = New-Object Microsoft.SharePoint.Client.RenderListDataOverrideParameters
$scope = ""
$nextHref = ""
$counter = 0
if( $Recurse.IsPresent )
{
$scope = "Scope='RecursiveAll'"
}
}
process
{
$results = while($true)
{
$counter++
$renderListDataParameters = New-Object Microsoft.SharePoint.Client.RenderListDataParameters
$renderListDataParameters.ViewXml = "<View $scope><ViewFields><FieldRef Name='FSObjType'/><FieldRef Name='FileRef'/><FieldRef Name='FileLeafRef'/></ViewFields><RowLimit Paged='TRUE'>5000</RowLimit></View>"
$renderListDataParameters.Paging = $nextHref
$renderListDataParameters.FolderServerRelativeUrl = $Folder.ServerRelativeUrl
$clientResult = $list.RenderListDataAsStream($renderListDataParameters, $overrideParameters)
Invoke-PnPQuery
try
{
$streamReader = New-Object System.IO.StreamReader( $clientResult.Value, ([System.Text.Encoding]::UTF8) )
$text = $streamReader.ReadToEnd()
$items = $text | ConvertFrom-Json
$items.Row | Select-Object `
FSObjType,
@{ Name="Path"; E={ $_.FileRef.Substring(0, $_.FileRef.LastIndexOf('/')) }},
@{ Name="Name"; E={ $_.FileLeafRef }}
if( $items.NextHref )
{
$nextHref = $items.NextHref.Substring(1)
}
else
{
break
}
}
finally
{
if( $streamReader ) { $streamReader.Dispose() }
}
}
if( $Detailed.IsPresent )
{
return $results
}
else
{
[PSCustomObject] @{
List = $list.Title
FolderServerRelativeUrl = $Folder.ServerRelativeUrl
FileCount = ($results | Where-Object -Property "FSObjType" -eq 0 | Measure-Object).Count
FolderCount = ($results | Where-Object -Property "FSObjType" -eq 1 | Measure-Object).Count
Total = $results.Count
}
}
}
end
{
}
}
Connect-PnPOnline `
-Url "https://$env:O365_TENANT.sharepoint.com/sites/teamsite" `
-ClientId $env:O365_CLIENTID `
-Thumbprint $env:O365_THUMBPRINT `
-Tenant $env:O365_TENANTID `
-ErrorAction Stop
$list = Get-PnpList -Identity "large list" -ThrowExceptionIfListNotFound -ErrorAction Stop
$folder = Get-PnPFolder -Url "$($list.RootFolder.ServerRelativeUrl)/5001 Items" -ErrorAction Stop
Get-FolderChildCount -List $List -Folder $folder -Recurse
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment