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?
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
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
@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. –