2013-07-05 4 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이있을 것이다. 여기

당신이 downloadFtp 함수에 전달할 수 있도록 파일 만 일치합니다 수정 된 try 블록 :

그런 다음 같은에 대해 다음 try 블록을 사용하여 디렉토리의 목록을 얻고 싶다면
try 
{ 
    if(!($filename -match '^d')){if((Test-Path ("C:\emsdropbox\"+$filename.Split(" ")[8])) -ne $true) 
    { 
     downloadFtp(($filename -split '\s+')[8]) 
    }} 
    $filename = $FTPReader.ReadLine() 
} 

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

당신은 다음과 같이 powershell에서 할 수 있습니다 :

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

이것은 정확한 방향으로 큰 걸음입니다! 하나의 문제지만 내가 ListDirectoryDetails로 바꿀 때 나는 이것을 얻는다 : 07-03-13 01:59 PM 0 hmm.odd 앞에 파일 속성이 없다 – staticFlow

+0

나는 주위에서 일하는 것을 결코 발견하지 못했다. – staticFlow

+0

FTP 서버 소프트웨어/구성에 따라 다를 수 있습니다. –