I'm trying to copy documents from a document library in staging environment to a document library in the preproduction environment using PowerShell CSOM. The code I've tested is as follows:
$loadInfo1 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
$loadInfo2 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
$loadInfo3 = [System.Reflection.Assembly]::LoadWithPartialName("System.IO")
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"
# Paramètres du script
$orgSiteUrl = "http://site1/"
$destSiteUrl = "http://site2/"
$orgLibrary = "Documents"
$destLibrary = "Documents"
$srcLibrary = $web.Lists["Documents"]
$destLibrary = $destWeb.Lists["Documents"]
$orgClientContext = $null
$destClientContext = $null
function MoveFiles(
[string]$orgSiteUrl,
[string]$destSiteUrl,
[string]$orgLibrary,
[string]$destLibrary
)
{
$UserName = 'someDomain\someUser'
$SecurePassword = "somePassword" | ConvertTo-SecureString -AsPlainText -Force
Write-Host "Script running with following account : "$UserName -ForegroundColor Yellow
# Get the Client Context and Bind the Site Collection
$ClientContext = New-Object Microsoft.SharePoint.Client.ClientContext($orgSiteUrl)
$destClientContext = New-Object Microsoft.SharePoint.Client.ClientContext($destSiteUrl)
# Connect to source site
$credentials = New-Object System.Net.NetworkCredential($UserName, $SecurePassword)
$ClientContext.Credentials = $credentials
$web = $ClientContext.Web
$ClientContext.Load($web)
$ClientContext.ExecuteQuery()
# Connect to destination site
$credentials = New-Object System.Net.NetworkCredential($UserName, $SecurePassword)
$destClientContext.Credentials = $credentials
$destWeb = $destClientContext.Web
$destClientContext.Load($destWeb)
$destClientContext.ExecuteQuery()
# Get List and List Items
$List = $web.Lists.GetByTitle($orgLibrary)
$ListItems = $List.GetItems([Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery())
$ClientContext.Load($List)
$ClientContext.Load($ListItems)
$ClientContext.ExecuteQuery()
# Get List and List Items
$destList = $destWeb.Lists.GetByTitle($destLibrary)
$destClientContext.Load($destList)
$destClientContext.ExecuteQuery()
For ($j=0; $j -lt $ListItems.Count; $j++){
$item = $ListItems[$j]
$ClientContext.Load($item)
$file = $item.File
$ClientContext.Load($file)
$binaryStream = $file.OpenBinaryStream()
$ClientContext.ExecuteQuery()
$FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
$FileCreationInfo.Overwrite = $true
$FileCreationInfo.ContentStream = $binaryStream
$FileCreationInfo.URL = $destList.RootFolder.ServerRelativeUrl + "/" + $item.File.Name
$Upload = $destList.RootFolder.Files.Add($FileCreationInfo)
$destClientContext.Load($Upload)
$destClientContext.ExecuteQuery()
}
}
MoveFiles -orgSiteUrl $orgSiteUrl -destSiteUrl $destSiteUrl -orgLibrary $orgLibrary -destLibrary $destLibrary -UserName $UserName -SecurePassword $SecurePassword
The problem appears when the script is trying to add the binary stream to the FileInfoCreation object in the following line :
$FileCreationInfo.ContentStream = $binaryStream
The error is as follows :
Exception setting "ContentStream": "Cannot convert the
"Microsoft.SharePoint.Client.ClientResult`1[System.IO.Stream]" value of type
"Microsoft.SharePoint.Client.ClientResult`1[[System.IO.Stream, mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]" to type "System.IO.Stream"."
At D:\Users\Rteetnous-int-setup\Desktop\MoveFileCSOM.ps1:77 char:9
+ $FileCreationInfo.ContentStream = $binaryStream
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
Exception calling "ExecuteQuery" with "0" argument(s): "parameters.Content,
parameters.ContentStream
Nom du paramètre: La valeur spécifiée n'est pas prise en charge pour le paramètre
parameters.Content, parameters.ContentStream."
At D:\Users\Rteetnous-int-setup\Desktop\MoveFileCSOM.ps1:81 char:9
+ $destClientContext.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServerException
It's obvious that it's a cast error, but I searched and googled for hours and found nothing.
Can anyone help me figure out how to do this or suggest another solution using client side scripting ?
Thanks.