【问题标题】:Files Upload to wrong folder on Sharepoint Online文件上传到 Sharepoint Online 上的错误文件夹
【发布时间】:2014-08-15 10:38:34
【问题描述】:

我一直在尝试使用 PowerShell 将文件和文件夹上传到 SharePoint Online。我快到了,但是递归方法中的代码有问题。它会将文件上传到它应该上传的文件夹中。例如,如果我有一个文件夹结构并且每个文件夹有 3 个文件:

文件夹1\文件夹2\文件夹3

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 
        }
}

【问题讨论】:

    标签: powershell file-upload powershell-3.0 sharepoint-online


    【解决方案1】:

    以下 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
    

    关键点:

    • 保留文件夹结构

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多