2017-12-01 14 views
1

배경 : PowerShell 내에서 FTP를 통해 원격 디렉터리 정보를 검색하기 위해 다양한 기술을 사용합니다.PowerShell 스크립트에서 FTP ListDirectoryDetails 스트림 읽기를 얼마나 지연시킬 수 있습니까?

아래 스크립트는 PowerShell에서 사용할 수있는 '기성품'FTP ListDirectailsDetails를 사용하여 원격 디렉터리 세부 정보를 검색하는 보편적 인 방법 인 것으로 보입니다. (link1, link2, link3) 잘 작동합니다.

$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 

do loop이 시작되면 지연이 설정됩니다. 여러 폴더를 검색하는 경우 지연 시간에 폴더 수를 곱합니다. 따라서 지연이 짧을수록 다운로드 속도가 빠릅니다. 나는 그것을 100 배로 떨어 뜨 렸고, 10 배의 향상을 보였다. 그러나 이런 일에있어서 전문가가 아니기 때문에 나는 그 지연의 필요성이나 지연이 충분하지 않은 것에 대한 결과를 정말로 이해하지 못한다.

누군가 우리가 여기서 다루고있는 메커니즘을 설명 할 수 있습니까?

답변

1

지연이 필요 없습니다. 그것은 아무 의미가 없습니다.

실제로, 그와는 반대로. 응답을 읽기에는 너무 오래 걸릴 수 있으므로 서버가 지연되면 연결이 끊어 질 수 있습니다.


그리고 그 코드는 무엇을하는지 미친 듯이 복잡합니다.

이 같은 작업을 수행합니다

$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() 

당신이 응답 한 줄 한 줄을 읽어해야하는 경우, 코드는 여전히 문제보다 훨씬 간단 할 수 있습니다. 그리고 이전 질문에 대한 대답에 이미 같은 코드를 게시했습니다. Can PowerShell use FTP to retrieve remote folder and subfolder directory data in a single transmission?

+0

와우, 나는 이전 게시물에서 무슨 일이 벌어지고 있었는지 알지 못했고 더 가까이서 연구해야했습니다. 그러한 것이 우리가 때때로 취하는 길입니다. 그 점을 지적 해 주셔서 감사합니다. 이전 교류 중 하나에 대해 의견을 말했기 때문에, 나는이 상황을 완전히 이해할 수 있도록이 단계를 단계적으로 진행하고 있습니다. WinSCP에서 끝나기를 전적으로 기대하지만, 단계별로 단계별로 나갈 것입니다. 위와 다른 게시물을 더 자세히 살펴보고 ListDirectoryDetails에 대한 스크립트 테스트를 다시 실행합니다. 언급 된 코드에서 지연이 발생하는지 확인해 주셔서 감사합니다. – Alan

+0

후속 조치. 마침내 위의 샘플과 언급 한 다른 링크를 사용하여 전체 스크립트를 코딩 할 수있었습니다. 당신은 큰 도움이되었습니다. 이제 ListDirectoryDetails가 완전히 작동하는 것을 보았습니다. WinSCPnet.dll이 PowerShell 스크립트인지 또는 다른 컴파일 된 모듈인지 묻고 싶습니다. ListDirectoryDetails보다 디렉토리 데이터를 훨씬 빨리 검색합니까? – Alan

+1

@Alan'WinSCPnet.dll'은'winscp.exe' 스크립트 인터페이스를 실행하는 C# 어셈블리입니다. https://winscp.net/eng/docs/library#purpose를 참조하십시오 - 아니요, WinSCP가 'FtpWebRequest'보다 훨씬 빠르다고 생각하지 않습니다. 두 가지 모두 동일하기 때문에. –