A pre-commit hook is used when you want to be able to fail the commit for some reason. Do you really want to fail a commit be cause your FTP site was down, or the disk was full?
You should only use pre-commit scripts to fail stuff that is under the developer's control such as files that are missing required properties, etc. This gives the developer a chance to correct the problem, then resubmit the commit.
A post-commit script still ties up the user's terminal as they wait for it to complete, but the script can fail and notify the user that something failed, but the commit happens anyway. If you want to do this with hooks, you should be doing it with a post-commit hook and not a pre-commit hook.
For what you want to do, hooks aren't a good way to go. What if the user commits a lot of files? Do they have to sit there for ten or so minutes while your hook script executes?
A better idea is to use a continuous build system like Hudson. Hudson will watch your Subversion repository, and can do the FTP task you want every time a user does a commit. With Hudson, you're not tying up the developer as they wait for the hook to complete, and you have a complete log of what happened with every single commit.
In fact, every site should be using a continuous build server. Even if you don't compile code, you still want to run tests against every commit.
Hudson even has FTP and SFTP plugins which may make your task easier to do. And, you can call pre-build and post-build scripts in Hudson, so you have the flexibility to do almost anything your heart desires.
Hudson runs on Windows servers and Unix servers. It is a Java process.
If you're on Windows, and you don't have PowerShell, you should download some scripting language you and use that to write your hooks. The standard batch programming language in the Windows command.exe processor is not very flexible or powerful. Since hooks run on the server, you only have to worry whether or not your hooks run on a single machine. Some programs use client-side hooks and if you write a hook, it must be capable on running on every single system a client might use.
I think you need a post-commit hook.
A svn hook can indeed be any executable or script file. Look here for some samples
You can use the built-in command line ftp client on windows. One way is to put your FTP commands in a text file, which you can generate from a batch file. Example:
echo put [filename]>>ftp.txt
ftp -s:ftp.txt [server]
Of course, you can also write a program to do this (e.g. in .Net, using the FtpWebRequest class), it doesn't have to be a batch script.