Add multiple folders in libraries using a CSV file
This script will create the folders (not nested) into the libraries provided in the CSV file.
Summary
This script sample will allow you to create the folders (not nested) into the SharePoint libraries provided in the CSV file.
Create folders on single SharePoint site
Below is an example of the format needed for your .csv file:
| libName | folderName |
|---|---|
| Customers | Contracts |
| Support | Roadmaps |
| Support | Analysis |
# Config Variables
$SiteURL = "https://contoso.sharepoint.com/sites/Ops"
$CSVFilePath = "C:\Temp\Folders.csv"
Try {
# Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
$Web = Get-PnPWeb
# Get the CSV file
$CSVFile = Import-Csv $CSVFilePath
# Read CSV file and create folders
ForEach($Row in $CSVFile)
{
# Get the Document Library and its site relative URL
$Library = Get-PnPList -Identity $Row.libName -Includes RootFolder
If($Web.ServerRelativeUrl -eq "/")
{
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl
}
else
{
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl.Replace($Web.ServerRelativeUrl,'')
}
# Replace Invalid Characters from Folder Name, If any
$FolderName = $Row.folderName
$FolderName = [RegEx]::Replace($FolderName, "[{0}]" -f ([RegEx]::Escape([String]'\"*:<>?/\|')), '_')
# Frame the Folder Name
$FolderURL = $LibrarySiteRelativeURL+"/"+$FolderName
# Create Folder if it doesn't exist
Resolve-PnPFolder -SiteRelativePath $FolderURL | Out-Null
Write-host "Ensured Folder:"$FolderName -f Green
}
}
catch {
write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}# SharePoint online site URL
$SiteURL = Read-Host -Prompt "Enter your SharePoint site URL (e.g https://contoso.sharepoint.com/sites/Company311)"
# Location of the CSV file
$CSVFilePath= "D:\dtemp\Folders.csv"
# Get Credentials to connect
$m365Status = m365 status
if ($m365Status -match "Logged Out") {
m365 login
}
Try {
# Get the CSV file
$CSVFile = Import-Csv $CSVFilePath
# Read CSV file and create folders
ForEach($Row in $CSVFile)
{
# Get the Document Library and its site relative URL
$Library = m365 spo list get --webUrl $SiteURL --title $Row.libName --properties "Title,Id,RootFolder/ServerRelativeUrl" | ConvertFrom-Json
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl
# Replace Invalid Characters from Folder Name, If any
$FolderName = $Row.folderName
$FolderName = [RegEx]::Replace($FolderName, "[{0}]" -f ([RegEx]::Escape([String]'\"*:<>?/\|')), '_')
# Create Folder if it doesn't exist
m365 spo folder add --webUrl $SiteURL --parentFolderUrl $LibrarySiteRelativeURL --name $FolderName
Write-host "Folder Created: "$FolderName -f Green
}
}
catch {
write-host "Error: $($_.Exception.Message)" -ForegroundColor Red
}
# Disconnect SharePoint online connection
m365 logoutCreate folders on multiple SharePoint sites
Below is an example of the format needed for your .csv file:
| libName | folderName | SiteUrl |
|---|---|---|
| Customers | Contracts | https://contoso.sharepoint.com/sites/site1 |
| Support | Roadmaps | https://contoso.sharepoint.com/sites/site2 |
| Support | Analysis | https://contoso.sharepoint.com/sites/site2 |
#Config Variables
$CSVFilePath = "C:\Temp\Folders.csv"
Try {
# Get the CSV file
$CSVFile = Import-Csv $CSVFilePath
# Read CSV file and create folders
ForEach($Row in $CSVFile)
{
$SiteURL = $Row.SiteUrl
# Connect to PnP Online
Connect-PnPOnline -Url $SiteURL -Interactive
$Web = Get-PnPWeb
# Get the Document Library and its site relative URL
$Library = Get-PnPList -Identity $Row.libName -Includes RootFolder
If($Web.ServerRelativeUrl -eq "/")
{
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl
}
else
{
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl.Replace($Web.ServerRelativeUrl,'')
}
# Replace Invalid Characters from Folder Name, If any
$FolderName = $Row.folderName
$FolderName = [RegEx]::Replace($FolderName, "[{0}]" -f ([RegEx]::Escape([String]'\"*:<>?/\|')), '_')
# Frame the Folder Name
$FolderURL = $LibrarySiteRelativeURL+"/"+$FolderName
# Create Folder if it doesn't exist
Resolve-PnPFolder -SiteRelativePath $FolderURL | Out-Null
Write-host "Ensured Folder:"$FolderName -f Green
}
}
catch {
write-host "Error: $($_.Exception.Message)" -foregroundcolor Red
}# Location of the CSV file
$CSVFilePath= "D:\dtemp\Folders.csv"
# Get Credentials to connect
$m365Status = m365 status
if ($m365Status -match "Logged Out") {
m365 login
}
Try {
# Get the CSV file
$CSVFile = Import-Csv $CSVFilePath
# Read CSV file and create folders
ForEach($Row in $CSVFile)
{
$SiteURL = $Row.SiteUrl
# Get the Document Library and its site relative URL
$Library = m365 spo list get --webUrl $SiteURL --title $Row.libName --properties "Title,Id,RootFolder/ServerRelativeUrl" | ConvertFrom-Json
$LibrarySiteRelativeURL = $Library.RootFolder.ServerRelativeUrl
# Replace Invalid Characters from Folder Name, If any
$FolderName = $Row.folderName
$FolderName = [RegEx]::Replace($FolderName, "[{0}]" -f ([RegEx]::Escape([String]'\"*:<>?/\|')), '_')
# Create Folder if it doesn't exist
m365 spo folder add --webUrl $SiteURL --parentFolderUrl $LibrarySiteRelativeURL --name $FolderName
Write-host "Folder Created: "$FolderName -f Green
}
}
catch {
write-host "Error: $($_.Exception.Message)" -ForegroundColor Red
}
# Disconnect SharePoint online connection
m365 logoutContributors
| Author(s) |
|---|
| Jiten Parmar |
| Ganesh Sanap |
Disclaimer
THESE SAMPLES ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
Tool documentation & references
- Want to learn more about PnP PowerShell and the cmdlets
Check out the PnP PowerShell site to get started and for the reference to the cmdlets.
- Want to learn more about CLI for Microsoft 365 and the commands
Check out the CLI for Microsoft 365 site to get started and for the reference to the commands.