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.
set instance=%~1
if %instance%z==z goto :_helpset flag=”f:\full backups\%instance%\flag.txt”
:loop
IF EXIST %flag% (
GOTO file_found
) else (
ping 127.0.0.1
GOTO loop
):file_found
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.txtFOR /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
del c:\temp\%instance%-control.txt
del c:\temp\%instance%.txtgoto :_end
:_help
@echo.
@echo Please specify an instance.:_end
exit
Linked as a separate file because smart quotes are not smart.