宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

因工作需要,经常要到服务器上下载一个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行:

  1. :: File name: MyFTP.bat  
  2. :: Description: This bat file downloads file from the 10.10.10.12 FTP server  

文件说明,属于注释部分。

bat中注释有如下方式:

  1. 注释本行
  2. rem 注释本行
  3. @ 将本行的命令不显示
  4. echo off 将本行一下的命令不显示
  5. 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学习资料