HOWTO: Using FTP or SFTP in PowerShell

PowerShell - a powerful new scripting language and command shell from Microsoft - has many built-in commands. However, it lacks support for transferring files over FTP, FTP/SSL or SFTP. Luckily, PowerShell is based on .NET and can invoke methods of .NET classes. Let's see how to upload or download files to an FTP or SFTP server from a PowerShell script using either Rebex FTP/SSL) or Rebex SFTP component.

Step 1 - Loading FTP or SFTP assembly

First, we have to load Rebex assemblies via [Reflection.Assembly]::LoadFrom command. You can load Rebex.Ftp.dll for FTP or FTP/SSL, Rebex.Sftp.dll for Rebex SFTP (or Rebex.FileTransfer.dll for both protocols). Other dependent assemblies will be loaded automatically as well. Of course, make sure the path to the assemblies matches our install path.

PS C:\> [Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Rebex Components 2015 R4.1\bin\net-4.0\Rebex.Ftp.dll")

GAC    Version        Location
---    -------        --------
False  v4.0.30319     C:\Program Files (x86)\Rebex Components 2015 R4.1\bin\net-4.0\Rebex.Ftp.dll

Step 2 - Connecting, logging in, uploading, downloading and deleting files

Now, you can call the FTP methods as described in the FTP Tutorial:

PS C:\> [Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Rebex Components 2015 R4.1\bin\net-4.0\Rebex.Ftp.dll")

GAC    Version        Location
---    -------        --------
False  v4.0.30319     C:\Program Files (x86)\Rebex Components 2015 R4.1\bin\net-4.0\Rebex.Ftp.dll

PS C:\> $ftp = New-Object Rebex.Net.Ftp
PS C:\> $ftp.Connect("test.rebex.net")
220 FTP on test.rebex.net ready...

PS C:\> $ftp.Login("demo", "password")
230 User demo logged in.

PS C:\> $ftp.PutFile("C:\temp\test.txt", "test.txt")
89
PS C:\> $ftp.GetFile("test.txt", "C:\temp\test2.txt")
89
PS C:\> $ftp.DeleteFile("test.txt")
PS C:\> $ftp.Disconnect()
221 Goodbye.

PS C:\> $ftp.Dispose()
PS C:\> Remove-Variable ftp
PS C:\>

That's all!

What about GAC?

And in case you would like to load Rebex assemblies from Global Assembly Cache (GAC) instead of from a path, use Assembly.Load method instead:

PS C:\> [Reflection.assembly]::Load("Rebex.Ftp, Version=4.0.5715.0
, Culture=neutral, PublicKeyToken=1c4638788972655d")

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\WINDOWS\assembly\GAC\Rebex.Ftp\4.0.5715.0__1c4638788972655d\Rebex.Ftp.dll