SharePoint Online: Get All Lists and Libraries using PowerShell

While working with SharePoint online, you may have to iterate through all lists in a site. Here is the PowerShell script to get all lists from SharePoint online site.

SharePoint Online: PowerShell to Get All Lists

Here is the PowerShell script to get all lists and libraries from given SharePoint online site

#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"
  
#Variables for Processing
$SiteUrl = "https://crescent.sharepoint.com/sites/sales"
$UserName="[email protected]"
$Password ="Password goes here"
 
#Setup Credentials to connect
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,(ConvertTo-SecureString $Password -AsPlainText -Force))

Try { 
    #Set up the context
    $Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteUrl) 
    $Context.Credentials = $credentials

    #sharepoint online powershell get all lists
    $Lists = $Context.web.Lists
    $Context.Load($Lists)
    $Context.ExecuteQuery()

    #Iterate through each list in a site   
    ForEach($List in $Lists)
    {
        #Get the List Name
        Write-host $List.Title
    }
}
catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

This PowerShell gets all list names from given SharePoint Online site.

Get the Inventory of All Lists in a SharePoint Online Site and Export to CSV

Let’s dig a bit deeper and get all list properties and export them to a CSV file

#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"

#Config Variable
$SiteURL = "https://crescent.sharepoint.com/sites/marketing"
$CSVPath = "C:\Temp\ListInventory.csv"

#Setup Credentials to connect
$Cred = Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)

Try {
    #Setup the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
    $Ctx.Credentials = $Credentials
   
    #Get Lists from the site
    $Web = $Ctx.Web
    $Lists = $Web.Lists
    $Ctx.Load($Web)
    $Ctx.Load($Lists)
    $Ctx.ExecuteQuery()

    $ListDataCollection = @()
    #Get List details
    ForEach ($List in $Lists)
    {
        $ListData = New-Object PSObject -Property ([Ordered] @{
        ListName = $List.Title
        Description = $List.Description
        ItemCount = $List.ItemCount
        BaseTemplateID = $List.BaseTemplate
        Created = $List.Created 
        BaseType = $List.BaseType
        ContentTypesEnabled = $List.ContentTypesEnabled
        Hidden = $List.Hidden
        ListId = $List.Id
        IsCatalog = $List.IsCatalog 
        LastItemDeletedDate = $List.LastItemDeletedDate 
        LastItemModifiedDate = $List.LastItemModifiedDate 
        ParentWebUrl = $List.ParentWebUrl 
        VersioningEnabled = $List.EnableVersioning    
        })
        $ListDataCollection += $ListData
    }
    $ListDataCollection

    #Export List data to CSV
    $ListDataCollection | Export-Csv -Path $CSVPath -Force -NoTypeInformation
    Write-host -f Green "List Statistics Exported to CSV!"
}
Catch {
    write-host -f Red "Error:" $_.Exception.Message
}

SharePoint Online: PowerShell Script to Iterate through all lists and libraries in a site collection

Now, Let’s make this code into a re-usable function and get list and library from all sites and subsites of given site.

#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"
  
#Variables for Processing
$SiteUrl = "https://crescent.sharepoint.com/sites/sales"
$UserName="[email protected]"
$Password ="Password goes here"
 
#Setup Credentials to connect
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,(ConvertTo-SecureString $Password -AsPlainText -Force))

Try {
    #Function to Get all lists from the web
    Function Get-SPOList($Web)
    {
        #Get All Lists from the web
        $Lists = $Web.Lists
        $Context.Load($Lists)
        $Context.ExecuteQuery()

        #Get all lists from the web   
        ForEach($List in $Lists)
        {
            #Get the List Name
            Write-host $List.Title
        }
    }

    #Function to get all webs from given URL
    Function Get-SPOWeb($WebURL) 
    {
        #Set up the context
        $Context = New-Object Microsoft.SharePoint.Client.ClientContext($WebURL)
        $Context.Credentials = $Credentials

        $Web = $context.Web
        $Context.Load($web)
        #Get all immediate subsites of the site
        $Context.Load($web.Webs)  
        $Context.executeQuery()
 
        #Call the function to Get Lists of the web
        Write-host "Processing Web :"$Web.URL
        Get-SPOList $Web
 
        #Iterate through each subsite in the current web
        foreach ($Subweb in $web.Webs)
        {
            #Call the function recursively to process all subsites underneaththe current web
            Get-SPOWeb($SubWeb.URL)
        }
    }

    #Call the function to get all sites
    Get-SPOWeb $SiteUrl
}
catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

Script Output:

powershell to get all lists in sharepoint online

PnP PowerShell to Get All Lists and Libraries in a Site Collection

Let’s get all Lists and Libraries Inventory of All Sites in a Site Collection and Export it to CSV file using PnP-PowerShell.

#Function to Get Lists and Libraries of a web
Function Get-SPOSiteInventory([Microsoft.SharePoint.Client.Web]$Web)
{
    Write-host -f Yellow "Getting Lists and Libraries from site:" $Web.URL

    #Get all lists and libraries
    $SiteInventory= @()
    $Lists= Get-PnPList -Web $Web
    foreach ($List in $Lists)
    {
        $Data = new-object PSObject
        $Data | Add-member NoteProperty -Name "Site Name" -Value $Web.Title
        $Data | Add-member NoteProperty -Name "Site URL" -Value $Web.Url
        $Data | Add-member NoteProperty -Name "List Title" -Value $List.Title
        $Data | Add-member NoteProperty -Name "List URL" -Value $List.RootFolder.ServerRelativeUrl
        $Data | Add-member NoteProperty -Name "List Item Count" -Value $List.ItemCount
        $Data | Add-member NoteProperty -Name "Last Modified" -Value $List.LastItemModifiedDate
        $SiteInventory += $Data
    }

    #Get All Subwebs
    $SubWebs = Get-PnPSubWebs -Web $Web
    Foreach ($Web in $SubWebs)
    {
        $SiteInventory+= Get-SPOSiteInventory -Web $Web
    }
    Return $SiteInventory
}

#Config Variables
$SiteURL = "https://crescenttech.sharepoint.com"
$CSVFile = "C:\temp\SiteData.csv"

#Get Credentials to connect
$Cred = Get-Credential

Try { 
    #Connect to PNP Online
    Connect-PnPOnline -Url $SiteURL -Credentials $Cred

    #Get the Root Web
    $Web = Get-PnPWeb

    #Call the function and export results to CSV file
    Get-SPOSiteInventory -Web $Web | Export-CSV $CSVFile -NoTypeInformation
}
Catch {
    write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}

To get all document libraries in SharePoint Online using PowerShell, use: SharePoint Online: PowerShell to List All Document Libraries

Salaudeen Rajack

Salaudeen Rajack is a SharePoint Architect with Two decades of SharePoint Experience. He loves sharing his knowledge and experiences with the SharePoint community, through his real-world articles!

9 thoughts on “SharePoint Online: Get All Lists and Libraries using PowerShell

  • October 29, 2019 at 3:19 PM

    For those getting the error about Cannot convert the “microsoft.sharepoint.client.web”, the fix for me was to remove the [Microsoft.SharePoint.Client.Web] from the first line in the function. It looks like this
    Function Get-SPOSiteInventory($Web)

    If you have MFA, the Connect-PnPOnline worked for me with just
    Connect-PnPOnline -Url $SiteURL

    Reply
  • October 4, 2019 at 9:54 PM

    Hello. I’m getting the same ‘Error Generating Site Permission Report! Cannot process argument transformation on parameter ‘Web’. Cannot convert the “Microsoft.SharePoint.Client.Web” value of type “Microsoft.SharePoint.Client.Web” to type “Microsoft.SharePoint.Client.Web”‘. Update-Module SharePointPnPPowerShellOnline didn’t work. Did you solve this?? Thank u very much.

    Reply
  • June 17, 2019 at 9:24 AM

    Error: WARNING: A newer version of PnP PowerShell is available: 3.10.1906.0. Consider upgrading.
    Error: Cannot process argument transformation on parameter ‘Web’. Cannot convert the “Microsoft.SharePoint.Client.Web” value of type “Microsoft.SharePoint.Client.Web” to
    type “Microsoft.SharePoint.Client.Web”.

    Reply
    • June 17, 2019 at 9:50 AM

      Use: Update-Module SharePointPnPPowerShellOnline to update the PnP Module for SharePoint Online!

      Reply
    • July 11, 2019 at 10:21 AM

      I’m having the same issue and I’m using the latest version of PnP Module.

      Did you manage to find a solution?

      Reply
  • January 19, 2019 at 2:26 PM

    HI,
    I am getting authentication Error message ..I am ensured that i have entered correct user name and password and MFA is disabled. Please let me know how to resolve the issue .
    Connect-SPOService : The sign-in name or password does not match one in the Microsoft account system.
    At D:kotiScriptssample3.ps1:8 char:1
    + Connect-SPOService -Url $turl -Credential $credential
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Connect-SPOService], IdcrlException
    + FullyQualifiedErrorId : Microsoft.SharePoint.Client.IdcrlException,Microsoft.Online.SharePoint.PowerShell.ConnectSPOService

    Reply
    • June 1, 2019 at 11:52 AM

      You can’t authenticate by hard-coding credentials if MFA is enabled for the Account. So, just remove the “-credentials” parameter and run the script, which prompts for login prompt that’s MFA aware!

      E.g: Connect-SPOService -Url $SiteURL

      Reply
  • August 30, 2018 at 5:28 AM

    Hi Salaudeen,

    For SharePoint on-premises, Can you publish another Powershell script to Iterate through all lists and libraries in Web Application and site collection level (Output like CSV file).

    Thanks,
    SV
    PowerShell Script

    Reply

Leave a Reply