因工作需要,经常要到服务器上下载一个Image到本地,每次都点来点去的,或者敲来敲去的,感觉烦,就捣鼓下bat来写个FTP自动下载,只要一条命令就搞定下载,很是方便。
1. 应用场景
FTP服务器地址: 10.10.10.12
用户名:me
密码:pwd
本地存储路径:c:\tftpboot\
2. 代码
:: File name: MyFTP.bat
:: Description: This bat file downloads file from the 10.10.10.12 FTP server@echo offset FTP_CMD_FILE=%temp%\TempAcc.txt
set FTPAddress=10.10.10.12
set TargetPath=c:\tftpboot\if "%1" == "" goto USAGE
if "%1" == "/?" goto USAGE
if "%1" == "-help" goto USAGEif "%2" == "" (set "TargetPath=%TargetPath%%~nx1"
) else (set "TargetPath = %2"
)rem ----------------生成FTP命令文件------------------------------------
>"%FTP_CMD_FILE%" echo me
>>"%FTP_CMD_FILE%" echo pwd
>>"%FTP_CMD_FILE%" echo binary
>>"%FTP_CMD_FILE%" echo hash
>>"%FTP_CMD_FILE%" echo get %1 %TargetPath%
>>"%FTP_CMD_FILE%" echo bye
rem ------------------------------------------------------------------echo FTP is trying to connect %FTPAddress%
ftp -s:"%FTP_CMD_FILE%" %FTPAddress% 2>nulif ERRORLEVEL 1 (echo Error: FTP server %FTPAddress% can not be connected!!!
)
if ERRORLEVEL 0 (echo %~nx1 is downloaded at %TargetPath%
)del /q %FTP_CMD_FILE%
goto END:USAGE
echo Usage: MYFTP source [destination]
echo For example:
echo MYFTP /tftpboot/tst.img
echo MYFTP /tftpboot/tst.img c:\tftpboot\tst.img:END
3. 代码解析
第1-2行:
- :: File name: MyFTP.bat
- :: Description: This bat file downloads file from the 10.10.10.12 FTP server
文件说明,属于注释部分。
bat中注释有如下方式:
- : 注释本行
- rem 注释本行
- @ 将本行的命令不显示
- echo off 将本行一下的命令不显示
- echo on 将本行一下的命令显示
注:bat中的命令默认会执行一条显示一条命令。如
:FileName show.batecho show echo off echo show
运行结果:
C:\Documents and Settings\Administrator>showC:\Documents and Settings\Administrator>echo show showC:\Documents and Settings\Administrator>echo off showC:\Documents and Settings\Administrator>
第4行:
@echo off
将本行及以下的代码都不显示。
第7-8行:
定义变量
set var=“val” ,这就是BAT直接在批处理中设置变量的方法! set 是命令, var是变量名, =号右边的"val"是变量的值。
在批处理中我们要引用var这个变量,就把var变量名用两个%(百分号)扩起来,如%var%。(将如下行)
第12-14行:
- 参数传递,%1-9%为输入参数,0%为命令本身。
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
0% 1% 2% 3% 4% 5% 6% 7% 8% 9% 10%
如果输入参数超过9个,就要使用shift命令。
- if语句
if 有三种格式:
1、if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
例:if "%1"=="a" format a:
2、if [not] exist [路径\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。如: if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文件,则显示它的内容。3、if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数 字,则条件成立,运行命令,否则运行下一句。(见第38-42行)
第18行:
%~nx1,对输入的一个参数扩展到文件名。(详见字符串扩展)
第25-30行:
>, >> 重定向
第35行:
- FTP命令,-s指定FTP执行命令文件。这个文件中含有你想做FTP的命令(一行一个命令或相应的参数,文件扩展名称不要以.bat或者.cmd),这样FTP就可以自动执行你想做的事情了。
- 2>nul,将错误信息重定向到nul,既不显示出来。1>nul,不显示正确的信息。若本行也加上1>nul,那么FTP命令执行的过程中将看不到任何信息,用户可能会怀疑FTP错了问题。所以不加入1>nul.
第47行:
goto Lable,跳转语句,跳转到Lable的地方。
其中Lable是用冒号(:)来表示的.
冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
4.参考资料
比较全的bat学习资料