2017-07-27 56 views
0

这一个一直困扰我好几天了,现在...它的工作原理有一半以上的时间,但会经常给我这个错误时调用的executeQuery()命令:PowerShell的SharePoint Online中的executeQuery错误 - 超时

异常调用 “的executeQuery” 和 “0” 的说法(S): “操作超时”

PowerShell的:

$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($webURL) 
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Credentials.UserName,$Credentials.Password) 

$web = $ctx.Web 
$ctx.Load($web) 

#Retrieve Library 
$list = $ctx.Web.Lists.GetByTitle($ITPurchaseRequestListName) 
$ctx.load($list) 

$files = $list.rootFolder.files 
$ctx.load($files) 
$ctx.executeQuery() 

########## 
if((test-path $tempPath) -eq $False) 
{ 
    new-item -itemtype directory -path $temppath 
} 

foreach($file in $files) 
{ 
    $ctx.load($file) 
    $ctx.executeQuery() 

    $fileRef = $file.ServerRelativeURL 
    $fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $fileRef); 

    $fileName = $tempPath + $file.Name 
    $fileStream = [System.IO.File]::Create($fileName) 
    $fileInfo.Stream.CopyTo($fileStream); 

    $fileStream.Close() 

    start-sleep -seconds 2 
} 

如果我杀控制台SESS并启动一个新的PowerShell窗口,它将运行几次运行,然后再次运行。有任何想法吗?

回答

1

除了其他意见和建议,在6sc.com里的人都能够帮助我找出根本原因这是一个缺少stream.close()在for循环。

foreach($file in $results) 
{ 

    $fileRef = $file["FileRef"]; 
    $fileName = $tempPath + $file["FileLeafRef"]; 

    $fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx, $fileRef); 
    $fileStream = [System.IO.File]::Create($fileName); 
    $fileInfo.Stream.CopyTo($fileStream); 

    $fileStream.Close(); 
    $fileInfo.Stream.Close(); 
} 
0

添加try..catch块到你的PowerShell脚本,它将被处理服务器超时,这将提供连续性执行。

的TRY的另一个好处... CATCH,你就可以有异常的详细信息,您可以捕获一个单独的日志文件,给你这个问题更多的线索。现在很难做出有根据的猜测,文件句柄可能正在使用,服务器I/O,文件可能以独占模式打开,连接可能在短时间内断开,很难说。

随着在try..catch捕获异常的日期和时间+细节将帮助你打开Windows事件查看器,并找出与精度发生了什么事。

0

我宁愿使用.OpenBinaryStream(),将其下载到内存,然后保存到光盘上。

代码:

foreach($file in $files) 
{ 
    $data = $file.OpenBinaryStream(); 
    $ctx.Load($file); 
    $ctx.ExecuteQuery(); 

    $memory = new-object system.io.MemoryStream 
    $buffer = new-object system.byte[](1024*64) 
    $pos = 0; 
    while (($pos = $data.Value.Read($buffer, 0, $buffer.Length)) -gt 0) 
    { 
     $memory.Write($buffer, 0, $pos); 
    } 
    $memory.Seek(0, [System.IO.SeekOrigin]::Begin); 

    $fileStream = [System.IO.File]::Create($fileName) 
    $memory.CopyTo($fileStream) 
    $memory.Close() 
    $fileStream.Close() 
}