2017-07-27 2 views
0

Dieser jetzt Tage rätselhaft mir wurde ... Es funktioniert mehr als die Hälfte der Zeit, aber wird mir oft diesen Fehler geben auf den ExecuteQuery() Befehl aufrufen:Powershell Sharepoint Online ExecuteQuery Fehler - Zeitüberschreitung

Exception "ExecuteQuery" mit "0" Argument (e) Aufruf: "Der Betrieb ist abgelaufen"

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

Wenn ich töte die Konsole sess Wenn Sie ein neues PowerShell-Fenster starten und starten, wird es für ein paar Durchläufe funktionieren und sich dann wieder zurückziehen. Irgendwelche Ideen?

Antwort

1

Zusätzlich zu den anderen Kommentaren und Vorschlägen, waren die Leute bei 6sc.com der Lage, die Ursache zu helfen, mich zu identifizieren, die eine fehlende stream.close for-Schleife() in der war .

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

einen try..catch Block zu Ihrem Powershell-Skript hinzufügen und es wird das Server-Timeout wird Handhabung, die Kontinuität der Ausführung bieten.

Der andere Vorteil des TRY ... CATCH, Sie können die Details der Ausnahme haben und Sie können in einer separaten Protokolldatei erfassen, die Ihnen zusätzliche Hinweise auf das Problem gibt. Im Moment ist es schwierig, eine fundierte Vermutung zu treffen, Dateihandles könnten verwendet werden, Server I/O, eine Datei könnte im exklusiven Modus geöffnet sein, die Verbindung könnte kurzzeitig unterbrochen sein, schwer zu erkennen.

Mit den try..catch Datum und Uhrzeit + Details der Ausnahme Erfassung werden Ihnen helfen, Windows-Ereignisanzeige zu öffnen und mit Präzision herausfinden, was passiert ist.

0

ich eher .OpenBinaryStream() verwenden würde, es in den Speicher laden und dann auf Disc speichern.

Code:

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() 
} 
Verwandte Themen