Showing posts with label Powershell. Show all posts
Showing posts with label Powershell. Show all posts

Saturday, May 31, 2014

FTP using Powershell

Below code can be used to perform FTP upload and Download using Powershell:

param([Parameter(Mandatory=$true,Position=0)] [string]$SourceFilePath, [Parameter(Mandatory=$true,Position=1)] [string]$TargetFilepath,[Parameter(Mandatory=$true,Position=2)][ValidateSet("Upload","Download")]$OperationType)

try
{

$Username = "temp-account"
$Password = "tempPassword"
     
         if($OperationType -eq "Upload")
 {
$serverUri = "ftp://ftp2.myweb.com" + $TargetFilepath
  }
          else
           {
              $serverUri =  "ftp://ftp2.myweb.com" + $SourceFilePath
            }  

     [System.Net.FtpWebRequest] $FTPrequest  =  [System.Net.FtpWebRequest]::Create($serverUri)
      $FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
$FTPRequest.Timeout = 10000  #Time out in Milliseconds
$FTPRequest.UsePassive = $true
$FTPRequest.UseBinary = $false
$FTPRequest.KeepAlive = $false   #This is important property  and terminates connection after
                                                                     # completion of operation

if($OperationType -eq "Upload")
{
              $SourceFile = $SourceFilePath

$FTPrequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile

Write-host "Uploading File..."  
#Create a request Stream
[System.IO.Stream] $requestStream = $FTPRequest.GetRequestStream()

if($requestStream -ne $null)
{
   #Read File to be uploaded
   $FileContents = Get-Content -path $SourceFile -encoding byte
#Write File
$requestStream.write($FileContents, 0, $FileContents.Length)
$requestStream.Close()  
$requestStream.dispose()

#Validating Status of Upload
[System.Net.FtpWebResponse] $response = $FTPrequest.GetResponse();
Write-host "File Upload Status $($response.StatusDescription)"  
$response.Close()
$response.dispose()
}
else
{
  [System.Net.FtpWebResponse] $response = $FTPrequest.GetResponse();
Write-host "File Upload Status $($response.StatusDescription)"  
}
}
elseif($OperationType -eq "Download")
{
           $TargetFile = $TargetFilepath
  Write-host "Downloading File..."
  $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile;

  #Get the response object
[System.Net.FtpWebResponse] $FTPResponse = $FTPRequest.GetResponse()
if($FTPResponse -ne $null)
{
[System.IO.Stream] $responseStream = $FTPResponse.GetResponseStream()
System.IO.FileStream]$FileStream = New-Object System.IO.FileStream($TargetFile,[System.IO.FileMode]::Create)
 [byte[]]$ReadBuffer = New-Object byte[] 1024

 do {
              $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
$FileStream.Write($ReadBuffer,0,$ReadLength)
                      } while ($ReadLength -ne 0)

 Write-host "File Download Status $($FTPResponse.StatusDescription)"

 $FileStream.Close()
 $FileStream.dispose()
         $responseStream.Close()  
 $responseStream.dispose()
}
}
}
 catch [Exception]
  {
    if($requestStream -ne $null)
{
 $requestStream.Close()  
 $requestStream.dispose()
}

if($responseStream -ne $null)
{
 $responseStream.Close()  
 $responseStream.dispose()
}

if($FileStream -ne $null)
{
 $FileStream.Close()  
 $FileStream.dispose()
}

    Write-host "Exception Type: $($_.Exception.GetType().FullName);`n
    Exception Code: $($_.Exception.ErrorCode);Exception Message: $($_.Exception.Message) "
  }


#Usage

#Upload
FTPUploadDownload.ps1 "D:\Temp\FileNametobeUploaded.txt"   "/FTPFolder/Targetfilename.txt"    Upload

#Download
 FTPUploadDownload.ps1 "/FTPFolder/Sourcename.txt"    "D:\Temp\DownloadedFileName.txt"  Download