How to Upload File to SharePoint Library using PowerShell?

We had a PowerShell script code to generate Large Lists reports in D:\Reports, and now want to periodically upload them to a document library "Reports" in my Admin site. So, scheduled a PowerShell script to do so. Here is my PowerShell code to upload the report to a document library.

Upload a File to SharePoint Library using PowerShell
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue 

#Function to Upload File
Function Upload-File($WebURL, $DocLibName, $FilePath)
{
    #Get the Web & Lists to upload the file
    $Web = Get-SPWeb $WebURL
    $List = $Web.GetFolder($DocLibName) 

    #Get the Files collection 
    $Files = $List.Files 

    #Get File Name from Path
    $FileName = $FilePath.Substring($FilePath.LastIndexOf("\")+1) 

    #Delete the File from library, if already exist!
    If($Files.Item($DocLibName +"/" + $FileName))
    {
        $Files.delete($DocLibName +"/" + $FileName)
    }
    #Get the File
    $File= Get-ChildItem $FilePath

    #Add File to the collection
    $Files.Add($DocLibName +"/" + $FileName,$File.OpenRead(),$false)

    #Dispose the objects
    $web.Dispose()
}
 
#call the upload function
Upload-File "http://sharepoint.company.com" "Monthly Reports" "D:\Reports\LargeLists.txt"

Upload File to SharePoint using PowerShell with Metadata:
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
 
#Function to Upload File and set metadata of the file
Function Upload-FileWithMetadata($WebURL, $DocLibName, $FilePath)
{
    #Get the SharePoint Web & Lists to upload the file
    $Web = Get-SPWeb $WebURL
    $List = $Web.GetFolder($DocLibName)
 
    #Get the Files collection from SharePoint Document Library
    $Files = $List.Files
 
    #Get File Name from Path
    $FileName = $FilePath.Substring($FilePath.LastIndexOf("\")+1)
 
    #Get the File from Disk
    $File= Get-ChildItem $FilePath

    #Set the Metadata
    $Metadata = @{}
    $Metadata.add("Department", "Sales")
    $Metadata.add("Location", "APAC");
 
    #Add File to Files collection of Document Library
    $Files.Add($DocLibName +"/" + $FileName,$File.OpenRead(), $Metadata,  $true) #true for overwrite file, if already exists!

    <# Alternatively, You can set the metadata as: 
       $UploadedFile=$Files.Add($DocLibName +"/" + $FileName,$File.OpenRead(), $true)
       $UploadedFile.Item["Department"]="Sales"
       $UploadedFile.Item.Update() 
    #>   
}
  
#call the upload function
Upload-FileWithMetadata "http://sharepoint.company.com" "Monthly Reports" "E:\Reports\UsageReport.csv"

If you are looking for a way to upload Files to SharePoint List or Library using C#, Have a look at my another post: How to Programmatically upload File to SharePoint document library?

If you wan to upload Multiple Files in Bulk, Refer: Bulk upload files to SharePoint using PowerShell

19 comments:

  1. What if the file has a metadata associated with it ? For e.g. if it has a "Month" field that need to be filled up while uploading the document ?

    ReplyDelete
    Replies
    1. Hi KR,

      Updated the post with setting Metadata values in PowerShell.

      Hope it helps.

      Delete
  2. Nice article Salaudeen, it really helped me a lot! However, I'm experiencing some problems when trying to update the "Title" column of a document. I just added the line:
    $Metadata.add("Title", "SomeValue")

    but nothing happened. Tried the second method as well:
    $UploadedFile.Item["Title"]="SomeValue"

    but again no success. Any idea what I might be doing wrong? Thanks in advance!
    Regards, Jan

    ReplyDelete
    Replies
    1. Hi Jan,

      For Title Field, Use: "vti_title" when you use Hash-table.

      $Metadata.add("vti_title", "Your Title Value")

      Delete
  3. Hi Salaudeen, i tried to update the "Title" column of a document item with both your methods, but without any success, unfortunately. Am I doing something wrong?

    First method: $Metadata.add("Title", "SomeValue") - Result: Title stays empty. Other metadata works fine!
    Second method: $UploadedFile.Item["Title"]="SomeValue" - Result: error message about Null valued array.

    Thanks for a great and helpful article, hope you can help a little bit more. Thanks in advance, and regards from the Netherlands!

    ReplyDelete
    Replies
    1. Hi Jan,

      Just verified the second method, Works as expected:

      $UploadedFile=$Files.Add($DocLibName +"/" + $FileName,$File.OpenRead(), $true)
      $UploadedFile.Item["Title"]= "Title Value Goes here"
      $UploadedFile.Item.Update()

      Delete
  4. Oops, I forgot another question: is it possible to set the Content Type used when uploading?

    ReplyDelete
    Replies
    1. Yes, You can set the Content Type for your items while uploading. Here is how:

      #Get the Content Type
      $ctype = $web.ContentTypes["YOUR-Content-Type"];
      #Set Content Type Property
      $Metadata.add("ContentTypeId", $ctype.Id);

      Regards,
      Sal

      Delete
  5. That's some prompt answering, Sal! Tried it al, works a charm. Thanks, your help is greatly appreciated! Regards, Jan

    ReplyDelete
  6. Hi Sal, is it possible to use this to update an item that is in a Managed Metadata column? I am able to get do a text entry just fine thanks to your script, but it will not work on Managed Metadata in a Term Store.

    ReplyDelete
    Replies
    1. True Ryan! Managed Metadata columns can't be used like normal list columns.
      To set Managed Metadata Column with Powershell, Refer this article: Updating SharePoint Managed Metadata Columns with PowerShell

      Delete
  7. Will this work if I want to copy a bunch of files to a sharepoint folder inside a library ?

    Also getting this error

    Exception getting "Item": "urlOfFile
    Parameter name: Specified value is not supported for the urlOfFile parameter."
    At line:33 char:4
    + if($Files.Item($DocLibName +"/" + $FileName))
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], GetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenGetting

    ReplyDelete
  8. can it taake metadata from excel ?

    ReplyDelete
  9. Hello,

    Is it possible to run the above script where SharePoint is not installed?

    Actually i am trying to upload documents to sharepoint site by running a script in non sharepoint server but its failing with an error.

    Could you please help me in achieving this.

    Thanks in Advance.

    ReplyDelete
  10. Do you have a SharePoint Online (O365) version for these scripts (especially the 'with metadata' version')?

    ReplyDelete

Please Login and comment to get your questions answered!

Powered by Blogger.