# Wednesday, January 31, 2007

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