后台:使用不同的技术在PowerShell中通过FTP检索远程目录信息。
下面的脚本似乎是使用PowerShell中提供的“现成的”FTP ListDirectoryDetails检索远程目录详细信息的常用方法。 (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,改进了十倍,它运行良好。但是,在这些事情上,我并不是一个大师,我并不真正理解延迟的必要性,也不了解延迟不足的后果。
有人可以解释我们在这里处理的机制吗?
答案 0 :(得分: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?
的回答中将这些代码发布给您了