,

Powershell Scripting – Automatic upload files to remote FTP

·

Powershell Scripting – Automatic upload files to remote FTP

Yesterday we had a needed, we needed to transfer every n minutes all the xml files located in a folder to a remote ftp location. There’s a lot of ways to do this and some of them include a payment softwares. In our case files were xml created by a SAP server in a Windows enviroment, for this reason we bet for a powershell script solution that we can call using Windows task scheduler

This script uses the WinSCP dll libraries, for this reason first of all we are going to install this light and free software

You’ll find here: https://winscp.net/eng/download.php

How the script works.

1.- The script, moves files from existing folder to a remote ftp site.

2.- After file is uploaded correctly, this  will be moved to a Success folder

3.- If file exists in Ftp or Success folder, this it will be overwrited

4.- If error occurs, this are going to print in an output log file

5.- All this movements with timestamp  will be written in a log

And this is the script that you have to put ins a ps1 file, for example upload_ftp.ps1


#Preparing log
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
#Log location file
Start-Transcript -path C:\ftpscript\log\log.txt -append


try 
	{ 
	# Load WinSCP .NET assembly 
	[Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\WinSCP\WinSCPnet.dll") | Out-Null 

	# Set FTP data
	$SessionOptions.DisableVersionCheck 
	$sessionOptions = New-Object WinSCP.SessionOptions 
	$sessionOptions.Protocol = [WinSCP.Protocol]::ftp 
	$sessionOptions.HostName = "ftp.remotelocation.com" 
	$sessionOptions.UserName = "ftpusername" 
	$sessionOptions.Password = "ftpmpassword" 
	# $sessionOptions.SshHostKeyFingerprint = "ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" 

	$session = New-Object WinSCP.Session 


	try 
		{ 
			# Connect 
			$session.Open($sessionOptions) 

			$localPath = "C:\ftpscript\upload\*.xml" 
			$remotePath = "/" 
			$backupPath = "C:\ftpscript\uploaded" 
			$aData = Get-Date
			


			# Upload files, collect results 
			#$TransferOptions() 

			$transferOptions = New-Object WinSCP.TransferOptions 
			$transferResult = $session.PutFiles($localPath, $remotePath) 

			# Files itineration
			foreach ($transfer in $transferResult.Transfers) 
				{ 
					# Correct o error? 
					if ($transfer.Error -eq $Null) 
						{ 
							Write-Host ("${aData} - File {0} was uploaded and moved to backup folder" -f 
							$transfer.FileName) 
							# If, Ok move to backup folder
							Move-Item $transfer.FileName $backupPath -force 
						} 
					else 
						{ 
							Write-Host ("${aData} - File {0} with error: {1}" -f 
							$transfer.FileName, $transfer.Error.Message) 
						} 
				} 
			} 
			
			finally 
			{ 
				# Disconnect and clean
				$session.Dispose() 
			} 

			exit 0 
	} 

catch [Exception] 
	{ 
		Write-Host $_.Exception.Message 
		exit 1 
	}	 

# Stop log writing
Stop-Transcript