文件上传到Sharepoint Online上的错误文件夹

时间:2014-07-28 13:46:22

标签: powershell file-upload powershell-v3.0 sharepoint-online

我一直在尝试使用PowerShell将文件和文件夹上传到SharePoint Online。我几乎就在那里,但递归方法中的代码有问题。它将文件上传到它应该的下面的文件夹中。例如,如果我有一个文件夹结构,每个文件夹有3个文件:

  

Folder1中\ FOLDER2 \ Folder3

Folder2和Folder3中的文件将上传到文件夹3.

我知道文件夹首先上传,因此$UploadSubFolder的路径会更新到较低的文件夹,但我不知道如何修复它!你能写一些代码,以便首先上传文件吗?

任何人都可以帮我解决这个问题吗?谢谢!

    Function ImportFiles()
{
   ForEach($File in Get-ChildItem $CurrentFolder)
   {    
        If($File.PSIsContainer -eq $false)
        {  
              #Upload File to Folder in Sharepoint
              $FileStream = New-Object IO.FileStream($File.FullName,[System.IO.FileMode]::Open)
              $FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
              $FileCreationInfo.Overwrite = $true
              $FileCreationInfo.ContentStream = $FileStream
              $FileCreationInfo.URL = $File
              $Upload = $UploadSubFolder.Files.Add($FileCreationInfo)
              $Context.Load($Upload)
              $Context.ExecuteQuery() 
        }
        ElseIf($File.PSIsContainer -eq $True)
        { 
              #Upload SubFolder

              $CurrentFolder = $CurrentFolder + "\" + $File.Name
              $NewFolder1 = Split-Path $File -leaf
              $UploadSubFolder = $UploadSubFolder.Folders.Add($NewFolder1) 
              $Context.Load($UploadSubFolder)
              $Context.ExecuteQuery()

              ImportFiles     
        }
        Else
        {
            Write-Host "Upload Complete"
        }
    }
}
#Get name of Root folder
$NewFolder = Split-Path $Folder -Leaf
#upload Root folder to sharepoint 
$UploadFolder = $List.RootFolder.Folders.Add($NewFolder)
$Context.Load($UploadFolder)
$Context.ExecuteQuery()

ForEach($File in (dir $Folder))
{
    if($File.PSIsContainer -eq $false)
    {
          #Upload File to Folder in Sharepoint
          $FileStream = New-Object IO.FileStream($File.FullName,[System.IO.FileMode]::Open)
          $FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
          $FileCreationInfo.Overwrite = $true
          $FileCreationInfo.ContentStream = $FileStream
          $FileCreationInfo.URL = $File
          $Upload = $UploadFolder.Files.Add($FileCreationInfo)
          $Context.Load($Upload)
          $Context.ExecuteQuery()
    }
    else
    {
            $CurrentFolder = $Folder + "\" + $File.Name
            #upload folder
            $NewFolder = Split-Path $File -leaf
            $UploadSubFolder = $UploadFolder.Folders.Add($NewFolder) 
            $Context.Load($UploadSubFolder)
            $Context.ExecuteQuery()
            ImportFiles 
        }
}

1 个答案:

答案 0 :(得分:0)

以下PS脚本可用于将文件上载到SharePoint Online中的文档库。

如何将文件上载到SharePoint Online中的文档库

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()
{
Param(
  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Web]$Web,

  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Folder]$ParentFolder, 

  [Parameter(Mandatory=$True)]
  [String]$FolderUrl

)
    $folderUrls = $FolderUrl.Trim().Split("/",[System.StringSplitOptions]::RemoveEmptyEntries)
    $folderUrl = $folderUrls[0]
    $curFolder = $ParentFolder.Folders.Add($folderUrl)
    $Web.Context.Load($curFolder)
    $web.Context.ExecuteQuery()

    if ($folderUrls.Length -gt 1)
    {
        $curFolderUrl = [System.String]::Join("/", $folderUrls, 1, $folderUrls.Length - 1)
        Ensure-Folder -Web $Web -ParentFolder $curFolder -FolderUrl $curFolderUrl
    }
}



Function Upload-File() 
{
Param(
  [Parameter(Mandatory=$True)]
  [Microsoft.SharePoint.Client.Web]$Web,

  [Parameter(Mandatory=$True)]
  [String]$FolderRelativeUrl, 

  [Parameter(Mandatory=$True)]
  [System.IO.FileInfo]$LocalFile

)

    try {
       $fileUrl = $FolderRelativeUrl + "/" + $LocalFile.Name
       [Microsoft.SharePoint.Client.File]::SaveBinaryDirect($Web.Context, $fileUrl, $LocalFile.OpenRead(), $true)
    }
    finally {
       #$fileStream.Close()
    }
}




function Upload-Files()
{

Param(
  [Parameter(Mandatory=$True)]
  [String]$Url,

  [Parameter(Mandatory=$True)]
  [String]$UserName,

  [Parameter(Mandatory=$False)]
  [String]$Password, 

  [Parameter(Mandatory=$True)]
  [String]$TargetListTitle,

  [Parameter(Mandatory=$True)]
  [String]$SourceFolderPath

)

    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 
    $Context.Load($web)
    $list = $web.Lists.GetByTitle($TargetListTitle);
    $Context.Load($list.RootFolder)
    $Context.ExecuteQuery()


    Get-ChildItem $SourceFolderPath -Recurse | % {
       if ($_.PSIsContainer -eq $True) {
          $folderUrl = $_.FullName.Replace($SourceFolderPath,"").Replace("\","/")   
          if($folderUrl) {
             Ensure-Folder -Web $web -ParentFolder $list.RootFolder -FolderUrl $folderUrl
          }  
       }
       else{
          $folderRelativeUrl = $list.RootFolder.ServerRelativeUrl + $_.DirectoryName.Replace($SourceFolderPath,"").Replace("\","/")  
          Upload-File -Web $web -FolderRelativeUrl $folderRelativeUrl -LocalFile $_ 
       }
    }
}

来源:Gist

用法

$Url = "https://contoso.sharepoint.com"
$UserName = "username@contoso.onmicrosoft.com"
$Password = "password"
$TargetListTitle = "Documents"   #Target Library
$SourceFolderPath = "C:\Users\me\Upload"  #Source Physical Path 


#Upload files
Upload-Files -Url $Url -UserName $UserName -Password $Password -TargetListTitle $TargetListTitle -SourceFolderPath $SourceFolderPath

关键点:

  • 保留文件夹结构