top of page
  • Arnaud

[SharePoint] Générer un rapport du contenu de vos dossiers


Il peut parfois être difficile de s'y retrouver dans les arborescences de dossiers SharePoint, ce script pourra vous être utile.

Grâce à ce script vous pourrez connaitre le nombre et le nom de chaque fichier ainsi que son emplacement.

L'intérêt est de lister le contenu d'un dossier spécifique, si vous souhaitez lister l'intégralité d'une bibliothèque, il vaut mieux utiliser "Get-PnPListItem".


Le script complet


Les explications


Nous allons utiliser powershell ainsi que les modules PnP et Import Excel :


Dans un premier temps il faut modifier ces deux variables (l'adresse de votre site SharePoint et le chemin du dossier que vous souhaitez analyser) :

$SiteURL = "https://yourtenant.sharepoint.com/sites/yoursite"
$FolderSiteRelativeURL = "/yourlibrary/rootfolder/subfolder"

Les variables de noms :

$Date = Get-Date -Format "dd_MM_yyyy HH.mm.ss"
$CorrectedName = $FolderSiteRelativeURL -replace "/", "  "
$TempDirectory = $env:TEMP 
$CsvName = "$TempDirectory\Tracker - $Date.csv"
$CsvName2 = "$TempDirectory\Count - $Date.csv"

Sélection de l'emplacement de destination de votre rapport :

Function Get-Folder($initialDirectory)
{   [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
    $OutputDirectory = New-Object System.Windows.Forms.FolderBrowserDialog
    $OutputDirectory.Description = "Select a destination folder to store the tracker file : "
    $OutputDirectory.rootfolder = "MyComputer"
    if($OutputDirectory.ShowDialog() -eq "OK")
    {
        $y += $OutputDirectory.SelectedPath
    }
    return $y
}
$TrackerPath = Get-Folder

Connexion à SharePoint et récupération de données utiles pour la suite :

Connect-PnPOnline -Url $SiteURL -Credentials (Get-Credential)
$Web = Get-PnPWeb
$Folder = Get-PnPFolder -Url $FolderSiteRelativeURL

Exploration des dossiers et sous-dossiers et export en csv :

Function Catch-PnPFolder([Microsoft.SharePoint.Client.Folder]$Folder)
{
$FolderSiteRelativeURL = $Folder.ServerRelativeUrl.Replace($web.ServerRelativeUrl,"")
Write-Host -f Green "Processing on folder : "($FolderSiteRelativeURL.Substring(20))
$Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File
$NameOfFiles = $Folder.ServerRelativeUrl
$NumberOfFiles = $Files.Count
Write-Host -f Green "Number of files in folder : $NumberOfFiles"
	
If ($NumberOfFiles -ge 0)
	{
	$Count = [PSCustomObject]@{
            Folder = $NameOfFiles
            'Number of Files'  = $NumberOfFiles
        }
	$Count | Select @{Name="Directory";Expression={($_.Folder )}}, 'Number of Files', Comments | Export-Csv -Path $CsvName2 -NoTypeInformation -Append -Force -Encoding UTF8
	
	}
    ForEach ($File in $Files)
    {
	    $File  | Select @{Name="Parent Directory";Expression={($_.ServerRelativeUrl -replace "/[^/]*$", "")}}, Name, TimeLastModified, Comments | Export-Csv -Path $CsvName -NoTypeInformation -Append -Force -Encoding UTF8
	}
    $SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder
    Foreach($SubFolder in $SubFolders)
    {
        If(($SubFolder.Name -ne "Forms") -and (-Not($SubFolder.Name.StartsWith("_"))))
        {
           Catch-PnPFolder -Folder $SubFolder
        }
    }
} 
Catch-PnPFolder -Folder $Folder

Tri des csv et fusion dans un fichier excel puis suppression des csv temporaires :

Write-Host ""
Write-Host ""
Write-Host -f Blue "Processing and extracting datas, please wait... "

Rename-Item "$CsvName" "$CsvName.old"
Import-Csv -Path "$CsvName.old" | sort "Parent Directory"| Export-Csv -Path "$CsvName" -NoTypeInformation -Encoding UTF8
Remove-Item "$CsvName.old"

Rename-Item "$CsvName2" "$CsvName2.old"
Import-Csv -Path "$CsvName2.old" | sort "Directory" | Export-Csv -Path "$CsvName2" -NoTypeInformation -Encoding UTF8
Remove-Item "$CsvName2.old"

Import-Csv "$CsvName" | Export-Excel -Path "$TrackerPath\$CorrectedName - $Date.xlsx" -AutoSize -TableStyle Medium4 -WorkSheetname "Tracker"
Import-Csv "$CsvName2" | Export-Excel -Path "$TrackerPath\$CorrectedName - $Date.xlsx" -AutoSize -TableStyle Medium4 -WorkSheetname "Count"

Remove-Item "$CsvName"
Remove-Item "$CsvName2"

Emettre un bip quand le rapport est terminé, ouvrir le rapport et fermer powershell :

[System.Media.SystemSounds]::Beep.Play()
Write-Host ""
Write-Host ""
Write-Host "End of script execution" 
Read-Host "Press Enter to open the tracker file and exit script..."
Invoke-Item "$TrackerPath\$CorrectedName - $Date.xlsx"
exit

Vous devriez récupérer un rapport excel ressemblant à ceci :




bottom of page