Dynamic FTP Scripts

I seem to be getting back to basics at the moment with some of the things I’m doing – and didn’t imagine myself having to get an automated FTP update working this week…


My objective was to ‘get’ files from a remote machine using a folder pattern consisting of the date in an ‘yymmdd’ format.  I’d forgotten that script files used with ftp (ftp -s:myscript.txt) are dumb text files, and if you want to ‘get’ from a dynamic location – or dynamic filenames you need to magic something up.


My interest was sparked here, and although I found a C# FTP library on CodeProject that would clearly do the job, and would be cool to use in itself, I was more interested in using ‘old skool’ lo-tech methods to solve the problem.


I read one article that suggested using batch files to spit out the ftp script.  Excellent idea I thought – so this is what I ended up with…. (I’ve changed a few details to protect the innocent so if it doesn’t quite work it’s only due to my own typo 🙂 )


I won’t explain each bit as that would spoil the fun – but the general gist is that FTPReportsForDate is normally run without parameters and it finds files in a specific folder and renames them on the local host.  The process also does other stuff I didn’t have time to go into….


FTPReportsForDate.cmd (which accepts a parameter or gets current date if not supplied)


@echo off


echo Creating Log Folder
IF NOT EXIST C:\logs\FTP\ md c:\logs\FTP


echo Removing previous processing date
IF EXIST processingdate.txt del processingdate.txt /F


IF “%1” == “” (
 echo Getting current processing date
 cscript //NoLogo GetCurrentDate.vbs >> processingdate.txt
 echo Transferring File
 FOR /F %%f in (processingdate.txt) do CALL FTPCommand.cmd %%f
)


IF “%1” NEQ == “” (
 echo Transferring File
 CALL FTPCommand.cmd %1
)


FTPCommand.cmd  This constructs the FTP script file and does the FTP itself…


IF EXIST FTPLatestFile.txt del FTPLatestFile.txt /F


Type FTPHeader.txt >> FTPLatestFile.txt
echo cd RP%1.IN >> FTPLatestFile.txt
echo get staticfilename.fil dyn%1.fil >> FTPLatestFile.txt
echo close >> FTPLatestFile.txt
echo bye >> FTPLatestFile.txt


ftp -s:FTPLatestFile.txt >> c:\logs\ftp\transfer_%1.log


FTPHeader.txt This contains the static information used in the FTP script


open 192.168.0.1
myftpuser
myftppwd
prompt
lcd c:\incoming



GetCurrentDate.vbs
gets current date in a yymmdd format in the event we don’t pass in a date to FTPReportsForDate.cmd


‘Simple script to output todays date in yymmdd format for FTP processing


Function pd(n, totalDigits)
 if totalDigits > len(n) then
  pd = String(totalDigits-len(n),”0″) & n
 else
  pd = n
 end if
End Function


Wscript.echo pd(RIGHT(YEAR(date()),2),2) & pd(MONTH(date()),2) & pd(DAY(date()),2)
Wscript.echo