2017-12-01 6 views
1

Hintergrund: Durch verschiedene Techniken zum Abrufen von Remote-Verzeichnisinformationen über FTP in PowerShell.In PowerShell-Skript, wie kurz kann ich das Lesen eines FTP-ListDirectoryDetails-Streams verzögern?

Das folgende Skript scheint eine beliebte Methode zum Abrufen von Remote-Verzeichnisdetails mithilfe der in der PowerShell verfügbaren FTP-ListDirectoryDetails "von der Stange" zu sein. (link1, link2, link3) und es funktioniert gut.

$server = "ftp://servername" 
$ftp = [system.net.ftpwebrequest] [system.net.webrequest]::create($server) 
$ftp.method = [system.net.WebRequestMethods+ftp]::listdirectorydetails 
$response = $ftp.getresponse() 
$stream = $response.getresponsestream() 

    $buffer = new-object System.Byte[] 1024 
    $encoding = new-object System.Text.AsciiEncoding 

    $outputBuffer = "" 
    $foundMore = $false 

    ## Read all the data available from the stream, writing it to the 
    ## output buffer when done. 
    do 
    { 
    ## Allow data to buffer for a bit 
    start-sleep -m 1000 

    ## Read what data is available 
    $foundmore = $false 
    $stream.ReadTimeout = 1000 

    do 
    { 
     try 
     { 
     $read = $stream.Read($buffer, 0, 1024) 

     if($read -gt 0) 
     { 
      $foundmore = $true 
      $outputBuffer += ($encoding.GetString($buffer, 0, $read)) 
     } 
     } catch { $foundMore = $false; $read = 0 } 
    } while($read -gt 0) 
    } while($foundmore) 

    $outputBuffer 

Wenn die do loop startet, wird eine Verzögerung festgelegt. Wenn mehrere Ordner abgerufen werden, wird die Verzögerung mit der Anzahl der Ordner multipliziert. Je kürzer die Verzögerung, desto schneller der Download. Ich habe es auf 100 reduziert, eine zehnfache Verbesserung, und es hat gut funktioniert. Aber da ich in diesen Dingen kein Guru bin, verstehe ich weder die Notwendigkeit der Verzögerung noch die Konsequenzen für eine unzureichende Verzögerung.

Kann jemand den Mechanismus erklären, mit dem wir es hier zu tun haben?

Antwort

1

Sie brauchen keine Verzögerung. Es macht keinen Sinn.

Eigentlich ganz im Gegenteil. Mit einer Verzögerung kann der Server die Verbindung schließen, da es möglicherweise zu lange dauert, eine Antwort zu lesen.


Und dieser Code ist wahnsinnig kompliziert für das, was es tut.

Dies wird das gleiche tun:

$url = "ftp://username:[email protected]/remote/path/" 
$request = [Net.WebRequest]::Create($url) 
$request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails 

$response = $request.GetResponse() 
$reader = New-Object System.IO.StreamReader($response.GetResponseStream()) 
$outputBuffer = $reader.ReadToEnd() 

Wenn Sie die Antwort line-by-line lesen müssen, kann der Code noch viel einfacher als in Ihrer Frage sein. Und ich habe Ihnen bereits einen solchen Code in meiner Antwort auf Ihre vorherige Frage geschrieben: Can PowerShell use FTP to retrieve remote folder and subfolder directory data in a single transmission?

+0

Wow, ich habe nicht erkannt, was im vorherigen Post vor sich ging und hätte es näher studieren sollen; So ist der Weg, den wir manchmal nehmen; Ich schätze es, dass Sie darauf hingewiesen haben. Als ich zu einem unserer vorherigen Austausch kam, arbeite ich Schritt für Schritt daran, sicherzustellen, dass ich verstehe, was passiert. Ich gehe davon aus, dass ich bei WinSCP landen werde, aber ich werde Schritt für Schritt dorthin kommen. Werde mich auch etwas genauer ansehen und den anderen Script-Test für ListDirectoryDetails posten und wiederholen. Danke für die Bestätigung der Verzögerung ist in dem genannten Code nicht sinnvoll. – Alan

+0

Nachverfolgung. Ich konnte endlich ein komplettes Skript mit den obigen Beispielen und dem anderen Link, den Sie notiert haben, schreiben. Du warst eine große Hilfe - Danke. Jetzt, da ich ListDirectoryDetails voll funktionsfähig sehe, möchte ich fragen, ob 'WinSCPnet.dll' PowerShell-Skript oder ein anderes kompiliertes Modul ist. Werden Verzeichnisdaten wesentlich schneller als ListDirectoryDetails abgerufen? – Alan

+1

@Alan 'WinSCPnet.dll' ist eine C# -Assembly, die die' winscp.exe'-Skriptschnittstelle ausführt. Siehe https://winscp.net/eng/docs/library#purpose - Nein, ich denke nicht, dass WinSCP wesentlich schneller ist als 'FtpWebRequest', da beide dasselbe unter der Haube tun. –

Verwandte Themen