2013-07-05 203 views
1

因此,在我的powershell脚本启动时,它会轮询一个ftp服务器并下载任何不在本地文件夹中的文件。问题是当它到达一个文件夹时,它将它们下载为文件。这是我在检查新的文件代码:文件夹下载为ftp文件

$LocFolder = 'C:\EMSDropBox\*' 
Remove-Item $LocFolder 
$ftprequest = [System.Net.FtpWebRequest]::Create("ftp://NZHQFTP1/tbarnes") 
$ftprequest.Proxy = $null 
$ftprequest.KeepAlive = $false 
$ftprequest.TimeOut = 10000000 
$ftprequest.UsePassive = $False 
$ftprequest.Credentials = New-Object System.Net.NetworkCredential("tbarnes", "Static_flow2290") 
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory 

$FTPResponse = $ftprequest.GetResponse() 
$ResponseStream = $FTPResponse.GetResponseStream() 
$FTPReader = New-Object System.IO.Streamreader($ResponseStream) 
$filename = $FTPReader.ReadLine() 
while($filename -ne $null) 
{ 
    try 
    { 
     if((Test-Path ("C:\emsdropbox\"+$filename)) -ne $true) 
     { 
      downloadFtp($filename) 
     } 
     $filename = $FTPReader.ReadLine() 
    } 
    catch 
    { 
     Write-Host $_ 
    } 
} 
$FTPReader.Close() 
$FTPResponse.Close() 
$ResponseStream.Close() 

,这是downloadFtp功能:

 # FTP Config 
$FTPHost = "****" 
$Username = "******" 
$Password = "*********" 
$FTPFile = $file 

# FTP Log File Url 
$FTPFileUrl = "ftp://" + $FTPHost + "/tbarnes/" + $FTPFile 

    # Create FTP Connection 
$FTPRequest = [System.Net.FtpWebRequest]::Create("$FTPFileUrl") 
$FTPRequest.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) 
$FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile 
$FTPRequest.UsePassive = $false 
$FTPRequest.UseBinary = $true 
$FTPRequest.KeepAlive = $false 
$targetfile = New-Object IO.FileStream (("C:\emsdropbox\"+$file),[IO.FileMode]::Create) 
# Get FTP File 
$FTPResponse = $FTPRequest.GetResponse() 
$ResponseStream = $FTPResponse.GetResponseStream() 
$FTPReader = New-Object -typename System.IO.StreamReader -ArgumentList $ResponseStream 
[byte[]]$readbuffer = New-Object byte[] 1024 

#loop through the download stream and send the data to the target file 
do{ 
    $readlength = $ResponseStream.Read($readbuffer,0,1024) 
    $targetfile.Write($readbuffer,0,$readlength) 
} 
while ($readlength -ne 0) 
$FTPReader.Close() 

林不知道为什么它不会拉下来的文件夹,以便任何帮助或指针将是巨大的!

回答

1

FTP方法不支持自行下载文件夹或递归,所以没有其他办法可以考虑这样做,但我在下面提出了建议。

更改该方法,以便区分文件和目录并相应地处理它们。

变化$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails

将在此格式列表:

-rwxrwxrwx 1 owner group   277632 Mar 4 17:15 xml_socket.log.rar 

目录将在地方-d在该行的开始。

这里是经修订的try块,将只匹配文件,这样你就可以传递给downloadFtp功能:

try 
{ 
    if(!($filename -match '^d')){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true) 
    { 
     downloadFtp(($filename -split '\s+')[8]) 
    }} 
    $filename = $FTPReader.ReadLine() 
} 

如果你想要再获得一个目录列表,请使用以下try块对同ftpresponse流并为每个,ListDirectoryDetails得到的文件列表中的每个目录中对它们进行处理:

try 
{ 
    if($filename -match '^d'){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true) 
    { 
     listdir(($filename -split '\s+')[8]) 
    }} 
    $filename = $FTPReader.ReadLine() 
} 

您可能还需要创建本地目录太WH ich你可以在powershell中做如下操作:

New-Item c:\emsdropbox\newdir -type directory 
+0

这是向正确方向迈出的巨大一步,谢谢!一个问题,虽然当我将其更改为ListDirectoryDe​​tails我得到这个:07-03-13 01:59 PM 0 hmm.odd没有在前面的文件属性 – staticFlow

+0

没关系,我找到了解决办法。 – staticFlow

+0

它可能取决于FTP服务器软件/配置 - 很高兴你找到了解决方法,但:-) –