2017-07-27 619 views
0

この1つは、今日のために私を困惑されている...それは半分以上の時間を動作しますが、多くの場合は、executeQuery()コマンドを呼び出すときに私は、このエラーを与える:PowerShellのSharePoint Onlineのは、executeQueryエラー - タイムアウトし

を"0" 引数(複数可)と "のexecuteQuery" を呼び出す

例外:

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

私はコンソールのSESを殺す場合:

PowerShellを "操作がタイムアウトしました" PowerShellの新しいウィンドウを起動すると、数回実行されてからもう一度起動します。何か案は?

答えて

1

、6sc.comの人々はのためのループで)私は不足しているstream.close(だった根本原因の特定に役立つことができました。

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イベントビューアを開き、発生したことを正確に調べるのに役立ちます。

1

私は、foreach文を使ってexecuteQuery()を呼び出すことは、パフォーマンスが悪いと思います。 "Include"を使用して、foreach文の外でファイルオブジェクトのプロパティをロードする方が良いです。私はむしろ、.OpenBinaryStream()を使用したメモリにそれをダウンロードし、ディスクに保存したい

参考URL

https://msdn.microsoft.com/en-US/library/office/ee539350(v=office.14).aspx#Anchor_5

0

コード:他のコメントや提案に加えて

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() 
} 
関連する問題