2010. 9. 28. 18:09


PowerShell
이용하면서 PowerShell 내에서 FTP 데이터를 다운 받아 처리 있는 방법은 없을까 고민하던 FTP 관련 함수들을 찾아보기 시작했습니다.

 

PowerShell에서 FTP 대한 기능들을 사용 있도록 해주는 모듈을 판매하는 업체도 있었지만, 해당 모듈을 구매하여 사용하는 것은 의미가 없으므로, 실제 데이터를 주고 받을 있는 함수들을 찾아보았습니다.

 

아래 내용은 FTP 이용하여 파일을 다운로드 하는 스크립트 입니다.

아래 내용에서 가장 중요한 부분은 .NET Component 사용하는 부분이며, 이에 대한 자세한 정보는 http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx 에서 확인 있습니다.

 

 

# Get-FTPfile 함수를 선언

function Get-FTPFile ($Source,$Target,$UserName,$Password) 

{ 

 

# FTP 주소를 .Net 컴포넌트중 FtpWebRequest의 Craete명령을 통해 열어 줍니다.

# 단, 이때 사용되는 $Source 주소의 경우 FTP Web Request이기 때문에 FTP://주소/ 형식으로 입력되어야 합니다.

$ftprequest = [System.Net.FtpWebRequest]::create($Source) 

 

 

# NetworkCredential Class는 기본, 다이제스트, NTLM, Kerberos 인증과 같은 암호 기반의 인증 체계에 자격증명을 제공하기 위해서 사용 합니다.

# 참고 : http://msdn.microsoft.com/ko-kr/library/system.net.networkcredential(v=VS.80).aspx

 

$ftprequest.Credentials = 

    New-Object System.Net.NetworkCredential($username,$password) 

 

# ::DownloadFile : FTP 서버에서 파일을 다운로드 하는데 사용되는 FTP RETR 프로토콜 메서드를 나타냅니다.

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile 

# UseBinary : FTP 서버에서 파일 전송시 데이터 형식을 지정하는 Boolean 값을 설정 합니다.

$ftprequest.UseBinary = $true 

# KeepAlive : FTP 서버에서 제어 연결이 요청 완료 후 닫히는지 여부를 결정 합니다. 지속적인 세션 유지를 위해 False 값을 줍니다.

$ftprequest.KeepAlive = $false 

 

# FTP 서버에 응답을 반환 하는 메서드를 ftpresponse에 지정합니다.

$ftpresponse = $ftprequest.GetResponse() 

 

# FTP 서버에서 보낸 응답 데이터를 포함하는 스트림을 검색하여 reponsestream에 지정합니다.

$responsestream = $ftpresponse.GetResponseStream() 

 

# System.IO.FileStream 클래스를 사용하여 로컬 시스템의 디렉토리에 파일을 생성 할 수 있도록 준비 합니다.

# 이때 아래 [IO.FileMode]::Create는 로컬 시스템에서 파일을 생성할때 동일한 이름이 있으면 덮어쓰고, 동일한 이름이 없으면 새로 생성 함을 의미 합니다.)

$targetfile = New-Object IO.FileStream ($Target, [IO.FileMode]::Create) 

 

# 파일을 받을 때 버퍼로 사용 할 ByteArray 변수를 생성합니다.

[byte[]]$readbuffer = New-Object byte[] 1024 

 

# ResponseStream.Read 메서드를 이용하여 Response된 Stream의 데이터를 Readbuffer에 저장하고 1024Byte 만큼 저장되면 이를 IO.FileStream의 Write 메서드를 이요하여 파일로 작성 합니다.

# 이 과정은 ResponseStream에서 읽어들인 데이터가 0일때까지 계속 됩니다. (파일을 받아오는 과정)

# 이와 관련된 과정은 http://msdn.microsoft.com/ko-kr/library/yet8z89t.aspx  http://msdn.microsoft.com/ko-kr/library/system.io.stream.read.aspx 를 참조하시기 바랍니다.

do{ 

    $readlength = $responsestream.Read($readbuffer,0,1024) 

    $targetfile.Write($readbuffer,0,$readlength) 

} 

while ($readlength -ne 0) 

# IO.FileStream.Close 메서드를 이용하여 파일을 닫습니다.

$targetfile.close() 

} 

 

# Get-FTPFile 함수 호출을 위한 기본적인 정보들을 입력합니다. 

$sourceuri = "ftp://MyFtpServer/FolderPath\File.txt" 

$targetpath = "C:\temp\MyFile.txt" 

$user = "Username" 

$pass = "Password" 

Get-FTPFile $sourceuri $targetpath $user $pass

 


다음편에서는
FTP 이용하기 (Upload Delete)편을 준비하도록 하겠습니다.

 

감사합니다.

Posted by 마성민
:
2010. 9. 28. 15:29

안녕하세요. 엉스데브 입니다.

오늘은 PowerShell 에서 작업 한 내용을 기록하는 방법에 대해 알아보겠습니다.

작업 내용을 기록하는 것은 아주 중요한 일입니다.
하지만, 작업만 하기에도 바쁜데 별도로 기록까지 하려면 어려움이 있는게 사실이죠.
그래서 PowerShell 은 기본적으로 History 기능을 제공하며, 대단히 큰  도움이 됩니다.

하지만, History 기능은 입력한 내용만 기록 할 뿐, 출력 내용까지 기록 하지는 않습니다.
입력 및 출력까지 PowerShell 로 작업 한 모든 기록을 남기고자 한다면, Start-Transcript cmdlet 을 사용하면 됩니다.




Start-Transcript cmdlet 을 아무런 추가 파라미터 없이 실행하게 되면, 기본적으로 내문서 디렉터리에
"PowerShell_transcript.날자시간정보.txt" 형식의 이름으로 작업 내용이 기록되는 파일이 생성 됩니다.




Start-Transcript cmdlet 의 자세한 파라미터 정보를 보시려면, 아래의 더보기 를 클릭하세요.




작업 내용 기록을 종료하고 싶을 때에는 Stop-Transcript cmdlet 을 사용하거나, 그냥 PowerShell 창을 닫으면 됩니다.




Start-Transcript cmdlet 을 Profile 에 넣어서 항상 작업 기록이 남도록 해 두었습니다. 든든하네요. ^^

작업 기록이란게 남길때는 귀찮지만, 나중에 필요할때는 정말 절실한 데이터 입니다.
여러분들 모두 작업 기록을 꼭 남기셔서 차후에 유용하게 사용하실 수 있기를 바랍니다.

Posted by 알 수 없는 사용자
:

BLOG main image
Windows Server를 공부 하는 사람들의 팀블로그 by 마성민

카테고리

분류 전체보기 (76)
Windows (2)
Powershell (56)
AD (0)
Exchange (6)
System Center (9)
IIS (0)
SQL (3)
Sharepoint (0)

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

Total :
Today : Yesterday :