我一直在尝试使用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
}
}
答案 0 :(得分:0)
以下PS脚本可用于将文件上载到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
关键点: