【问题标题】:In PowerShell script how short can I delay reading an FTP ListDirectoryDetails stream?在 PowerShell 脚本中,我可以延迟读取 FTP ListDirectoryDe​​tails 流的时间有多短?
【发布时间】:2017-12-01 16:22:06
【问题描述】:

背景:通过不同的技术在 PowerShell 中通过 FTP 检索远程目录信息。

下面的脚本似乎是一种使用 PowerShell 中可用的“现成”FTP ListDirectoryDe​​tails 检索远程目录详细信息的流行方式。 (link1link2link3)而且效果很好。

$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,提高了十倍,而且效果很好。但我不是这些事情的专家,我并不真正了解延迟的必要性,也不了解延迟不足的后果。

有人能解释一下我们在这里处理的机制吗?

【问题讨论】:

    标签: powershell ftp ftpwebrequest


    【解决方案1】:

    您不需要任何延迟。这没有任何意义。

    其实恰恰相反。由于延迟,服务器可能会关闭连接,因为您可能需要很长时间才能读取响应。


    而且该代码的功能异常复杂。

    这将做同样的事情:

    $url = "ftp://username:password@ftp.example.com/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?的回答中向你发布了这样的代码

    【讨论】:

    • 哇,我不知道上一篇文章中发生了什么,应该仔细研究一下;这就是我们有时走的路;感谢您指出这一点。正如我对我们之前的一次交流所发表的评论一样,我正在逐步完成这一工作,以确保我完全了解正在发生的事情。我完全希望最终进入 WinSCP,但我会一步一步到达那里。还将更仔细地查看上面和其他帖子,并重做我的 ListDirectoryDe​​tails 脚本测试。感谢您确认延迟在提到的代码中没有意义。
    • 跟进。我终于能够使用您上面的示例和您提到的其他链接编写一个完整的脚本。你是一个很大的帮助-谢谢。现在我看到 ListDirectoryDe​​tails 完全正常工作,我想问一下 WinSCPnet.dll 是 PowerShell 脚本还是其他一些已编译的模块。它检索目录数据的速度是否比 ListDirectoryDe​​tails 快得多?
    • @Alan WinSCPnet.dll 是运行 winscp.exe 脚本接口的 C# 程序集。请参阅 winscp.net/eng/docs/library#purpose - 不,我认为 WinSCP 不会比 FtpWebRequest 快得多,因为两者在引擎盖下都是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2023-03-03
    • 2014-01-04
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多