I needed to SFTP a bunch of files ranging in size from 40 meg to 130 gig. The default behavior of “mput *” is to copy the files in alphabetical order, but what happens then is that all the smaller files pile up behind the large ones. This is bad because there’s a time limit and I want to copy as many as possible before the time limit passes. The solution?
Pre-sort them by size, smallest to largest.
These are encrypted database backups, so the script requires a SQL Server instance name. You can, of course, edit that behavior.
This depends upon PuTTY and Pageant. Create an SSH profile with key-based authentication and use Pageant to handle the key as described in the link. My SSH profile in this case is named “Atlanta” because that’s where the files are being copied.
This also assumes that you have directories in the SFTP server named with the pattern servername-instance because I’m running multiple streams. Also, the last thing the database backup does is copy a file called “flag.txt” to the backup directory so the script knows when backups are done and can start copying.
if %instance%z==z goto :_help
set flag=”f:\full backups\%instance%\flag.txt”
IF EXIST %flag% (
) else (
dir “f:\full backups\%instance%” /os /b /a-d-h > c:\temp\%instance%.txt
echo lcd “f:\full backups\%instance%” >> c:\temp\%instance%-control.txt
echo cd %computername%-%instance% >> c:\temp\%instance%-control.txt
FOR /F %%L IN (c:\temp\%instance%.txt) DO (
echo put %%L >> c:\temp\%instance%-control.txt
echo quit >> c:\temp\%instance%-control.txt
“c:\Program Files (x86)\PuTTY\psftp.exe” Atlanta -b c:\temp\%instance%-control.txt
@echo Please specify an instance.
Linked as a separate file because smart quotes are not smart.