PowerShell: SFTP Script to Upload Files to an SFTP Server

This script uses the Posh-SSH module to complete the upload task.
Currently this module does not support folders.


This script will connect to and upload files from a source directory to a SFTP server, then move those files to another directory and email you along the way, start and finish.

Currently configured to use Private/Public key pairs but can be easily converted to use a regular username/password if so desired.  I used PuTTYgen to make the keys, but you can use anything that tickles your fancy.

Note: Places that need/can be modified are headed by “#Change Variables Here!!”. Hope that’s self explanatory enough.


I’m sure it can be tweaked some more, even have a few ideas I want to try when I have time, but it served the purpose I had at the time.
Will update it if the need arises again, but… don’t hold your breath.


1) Install the Posh-SSH module, then save it to a folder of your choice. Instructions found at this link.
2) Modify the script (line 36) to point to the root folder containing your newly saved Posh-SSH module folder, or comment it out if you intend to install the module everywhere you intend to use the script.


	Uploads files to an SFTP server.
	Folders are not supported.
	Uses Private/Public key file to logon to SFTP server.
	Can be easily converted to use a simple username/password.

	Uploads all files in the source folder to a destination SFTP server.
	Areas that can be modified are headed by "#Change Variables Here!!"

	Author:		Derek Bannard
	Filename:	SFTP_Upload_Posh-SSH.ps1
	Version:	1.00
	Date:		2018/01/03

	None. This script requires direct modification to set paths and variables.


#Change Variables Here!!
#Global variables
$sftpServer = "IP Address or Hostname of SFTP Server"
$sftpDestPort = "22"
$sftpRemotePath = "/"
$sftpUsername = "sftp_user"
$srcFolder = "C:\SFTP\Incoming"			# Folder containing the files you want to upload.
$dstFolder = "C:\SFTP\Outgoing"			# Folder that the script will move the files to after uploading.

#Change Variables Here!!
#Import the SFTP Module & CmdLets in per session mode.
$env:PSModulePath = $env:PSModulePath + ";C:\SFTP\Modules"
Import-Module Posh-SSH

#Change Variables Here!!
#Define the Private Key file path
$pKeyFile = "C:\SFTP\KEY\private.KEY"			# Generate key using program like PuTTYgen
$nopasswd = new-object System.Security.SecureString

#Set Credetials to connect to server
$CredDest = New-Object System.Management.Automation.PSCredential($sftpUsername, $nopasswd)

#Get todays date
$todayDate = Get-Date -Format "yyyy-MM-dd HHmm"
$folderDate = Get-Date -Format "yyyyMMdd"

#Remove any open sessions
Get-SFTPsession | Remove-SFTPSession | Out-Null

#Create SFTP Session
$Session = New-SFTPSession -ComputerName $sftpServer -Credential $CredDest -KeyFile $pKeyFile -Port $sftpDestPort

#Change Variables Here!!
#Send an email when process has started
#Email the list
$Body = "SFTP Script Started`r`n`nHost: $($Session.Host)"
$Subject = "$todayDate - SFTP Upload Started"
$SMTP = "smtp-server.domain.com"
$To = "Notification Email List <notifications@domain.com>"
$From = "SFTP Notifications <sftpnotifications@domain.com>"
Send-MailMessage -To $To -From $From -SmtpServer $SMTP -Body $Body -Subject $Subject 

#Specify the local files
Set-Location $srcFolder
$LocalFiles = Get-ChildItem $srcFolder

#Now copy the files up
ForEach ($LocalFile in $LocalFiles)
Set-SFTPFile -SessionId $Session.SessionId -LocalFile "$LocalFile" -RemotePath "$sftpRemotePath" -Overwrite

#Create a list of uploaded files
$Files = (Get-SFTPChildItem -SessionId $Session.SessionId -Path "$sftpRemotePath") | Select Name,FullName,Length | Sort-Object FullName
#$msgFiles = $Files | where-object {$_.FullName -ne "/." -and $_.FullName -ne "/.."}
$msgFiles = $Files | where-object {$_.Length -ne "0"}

#Send an email when process has ended
#Email the list
$Body = "SFTP Script Ended `r`n`nFiles moved from $srcFolder to $dstFolder`r`n`nHost: $($Session.Host)`r`n`nFiles Names:`r`n"
$msgFiles | ForEach {$Body += " $($_.Name)`n"}
$Subject = "$todayDate - SFTP Upload Completion Report"
Send-MailMessage -To $To -From $From -SmtpServer $SMTP -Body $Body -Subject $Subject 

#Remove the session
Get-SFTPsession | Remove-SFTPSession

#Move the local files after processing
$LocalFiles | Move-Item -Destination $dstFolder -Force