Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell Script to upload an entire folder to FTP

I'm working on a PowerShell script to upload the contents of an entire folder to an FTP location. I'm pretty new to PowerShell with only an hour or two of experience. I can get one file to upload fine but can't find a good solution to do it for all files in the folder. I'm assuming a foreach loop, but maybe there's a better option?

$source = "c:\test"
$destination = "ftp://localhost:21/New Directory/"
$username = "test"
$password = "test"
# $cred = Get-Credential
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential($username, $password)

$files = get-childitem $source -recurse -force
foreach ($file in $files)
{
    $localfile = $file.fullname
    # ??????????
}
$wc.UploadFile($destination, $source)
$wc.Dispose()
like image 615
HMan06 Avatar asked Aug 03 '15 15:08

HMan06


People also ask

Can I upload an entire folder using FTP?

No way. you must upload each files separate. you can first crawl directories and then upload each file. you have this limit too for delete a directory via ftp.

How do I copy an entire folder in PowerShell?

Use Copy-Item Cmdlet to Copy Folder With Subfolders in PowerShell. The Copy-Item cmdlet copies an item from one location to another. You can use this cmdlet to copy the folder and its contents to the specified location. You will need to provide the source and destination path to copy from one place to another.


1 Answers

The loop (or even better a recursion) is the only way to do this natively in PowerShell (or .NET in general).

$source = "c:\source"
$destination = "ftp://username:[email protected]/destination"

$webclient = New-Object -TypeName System.Net.WebClient

$files = Get-ChildItem $source

foreach ($file in $files)
{
    Write-Host "Uploading $file"
    $webclient.UploadFile("$destination/$file", $file.FullName)
} 

$webclient.Dispose()

Note that the above code does not recurse into subdirectories.


If you need a simpler solution, you have to use a 3rd party library.

For example with WinSCP .NET assembly:

Add-Type -Path "WinSCPnet.dll"
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.ParseUrl("ftp://username:[email protected]/")

$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

$session.PutFiles("c:\source\*", "/destination/").Check()

$session.Dispose()

The above code does recurse.

See https://winscp.net/eng/docs/library_session_putfiles

(I'm the author of WinSCP)

like image 78
Martin Prikryl Avatar answered Nov 05 '22 11:11

Martin Prikryl