How to: Upload files into Office 365 via PowerShell


Being one of the most common questions “How to upload files to SharePoint Library?”, i noticed that usually folder structure is not taken into account in the provided solutions.
So i decided to fill the gap and implement another version that allows to preserve folder structure while uploading files.


PowerShell script

PowerShell script demonstrates how to upload  files within a specified local directory to a Document Library within a Site in an O365 tenant.

Add-Type Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Function Ensure-Folder()
$folderNames = $FolderUrl.Trim().Split("/",[System.StringSplitOptions]::RemoveEmptyEntries)
$folderName = $folderNames[0]
Write-Host "Creating folder [$folderName] …"
$curFolder = $ParentFolder.Folders.Add($folderName)
Write-Host "Folder [$folderName] has been created succesfully. Url: $($curFolder.ServerRelativeUrl)"
if ($folderNames.Length -gt 1)
$curFolderUrl = [System.String]::Join("/", $folderNames, 1, $folderNames.Length 1)
EnsureFolder Web $Web ParentFolder $curFolder FolderUrl $curFolderUrl
Function Upload-File()
try {
$fileUrl = $FolderRelativeUrl + "/" + $LocalFile.Name
Write-Host "Uploading file [$($LocalFile.FullName)] …"
[Microsoft.SharePoint.Client.File]::SaveBinaryDirect($Web.Context, $fileUrl, $LocalFile.OpenRead(), $true)
Write-Host "File [$($LocalFile.FullName)] has been uploaded succesfully. Url: $fileUrl"
catch {
write-host "An error occured while uploading file [$($LocalFile.FullName)]"
function Upload-Files()
if($Password) {
$SecurePassword = $Password | ConvertTo-SecureString AsPlainText Force
else {
$SecurePassword = Read-Host Prompt "Enter the password" AsSecureString
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($Url)
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName,$SecurePassword)
$Context.Credentials = $Credentials
$web = $Context.Web
$list = $web.Lists.GetByTitle($TargetListTitle);
Get-ChildItem $SourceFolderPath Recurse | % {
if ($_.PSIsContainer -eq $True) {
$folderUrl = $_.FullName.Replace($SourceFolderPath,"").Replace("\","/")
if($folderUrl) {
EnsureFolder Web $web ParentFolder $list.RootFolder FolderUrl $folderUrl
$folderRelativeUrl = $list.RootFolder.ServerRelativeUrl + $_.DirectoryName.Replace($SourceFolderPath,"").Replace("\","/")
UploadFile Web $web FolderRelativeUrl $folderRelativeUrl LocalFile $_
$Url = ""
$UserName = ""
$Password = "password"
$TargetListTitle = "Documents" #Target Library
$SourceFolderPath = "C:\Users\user\Upload" #Source Physical Path
#Upload files
UploadFiles Url $Url UserName $UserName Password $Password TargetListTitle $TargetListTitle SourceFolderPath $SourceFolderPath


18 thoughts on “How to: Upload files into Office 365 via PowerShell

  1. Great script, but don’t forget to close the stream:

    $FileStream = $LocalFile.OpenRead();
    [Microsoft.SharePoint.Client.File]::SaveBinaryDirect($Web.Context, $fileUrl, $FileStream, $true)

  2. i tried to use this script but i got an error. it says that “Documents” does not exist. as i have checked, Document library folder exist on my SharePoint account.

    • If your native language is different than English try typing “documents” in your own language that worked for me.

  3. Thanks for the script it’s great. I am trying to figure out how to start the import one level deeper and wonder if had a tip? So not at the root level context but starting at a sub-folder? Thanks!

  4. When i attempt to upload to sharepoint online, I can create the folder structure but no documents will create. I’ve tried running as administrator and normal user, The account I’m using on the sharepoint online is the site owner so doesnt have the required permissions.

  5. I need to do this for a OneDrive migration, but what I want is to create a folder called “Archive” and then copy all the content into that folder so users don’t get cluttered with old content. Any clues? I’m OK with Powershell generally but only just started looking as Sharepoint, CSOM, etc.

    • My workaround at present for this is to move the existing HomeDrive content into a “Archive” folder at the source using standard file operations I understand, but this isn’t ideal.

  6. I am getting error as
    Exception calling “ExecuteQuery” with “0” argument(s): “The sign-in name or password does not match one in the Microsoft account system.”

    But the account do exists.

    The account is working if I login through webportal.

    • I am also getting the same error. How to fix this. Credentials are working through web portal but not via script..

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.