中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 有关ftp下载、上传的批处理编写经验
作者:
标题: 有关ftp下载、上传的批处理编写经验 上一主题 | 下一主题
exzzz
初级用户

游手好闲 + 无所事事 ..



积分 194
发帖 167
注册 2007-4-30
状态 离线
『楼 主』:  有关ftp下载、上传的批处理编写经验

最近看到很多人问ftp相关的问题,正好几年前我写过一个ftp上传下载的脚本,就简单的总结一下ftp批处理的几点经验,希望能对新手有所帮助

1、如何在批处理中调用ftp?
将你要在ftp中操作的命令输出到某个txt文件,然后用ftp -s命令运行该脚本
首先
echo todo1>xxx.txt
echo todo2>>xxx.txt
echo todo3>>xxx.txt
然后使用 ftp -s:xxx.txt  就可以执行了

2、ftp下支持的命令有哪些?常用的又有哪些?
支持的命令请看如下输出
C:\Users\Administrator>ftp
ftp> help

最常用的命令有:
!  临时切换到cmd下执行某个外部命令,执行后返回ftp命令行
open XXX.XXX.XXX.XXX 连接到某个ftp服务器IP
user/pwd  切换用户名/密码(pwd在serv-u下貌似没有效果),一般open后直接依序输入用户名密码即可,但是实际测试,在批处理中生成txt再用ftp -s的话,密码后需要加多个空格,否则可能服务器无法继续下一步。(ftp服务端是serv-u)
cd  在服务器端切换目录(ftp服务器端保存文件的目录),即远端目录(以下简称远端)
lcd  指定本地目录(本地保存文件的目录),即本地目录(以下简称本地)
ascii/binary 使用ascii或binary传输模式,分别主要用于文本/程序文件,一般情况下不需修改,如果下载的程序出错,尝试用bin传输
delete  删除远端的文件
dir/ls  列出远端文件的目录
put 用法是put xxx 将本地lcd指定目录中的xxx文件上传到远端cd指定的目录
get 用法是get xxx 将远端的xxx文件下载到本地目录
mdelete/mdir/mget  想象成对应命令的 XXX * 版本吧,我没用过
mkdir 在远端创建目录
prompt  修改提示符(没用过,应该是这样)
rename 远端更改文件名
rmdir  远端删除文件夹
bye 断开连接

3、ftp手动操作的步骤
ftp  :运行ftp命令
open 58.61.XXX.XXX  :链接到ftp服务器
username   :用户名
password   :密码
hash   :忘记干嘛的了。。。
bin    :二进制传输文件,我的是个exe程序
cd bak   :远端目录切换到 .\bak
lcd e:\bak  :本地目录切换到  e:\bak
ls . e:\bak\filelist.txt  :读取远端目录.\bak下的文件列表并输出到本地文件 e:\bak\filelist.txt
quit   :断开连接,退出ftp


4、使用脚本控制ftp
将例子3中的每一行前面加上echo 后面加上>>job.txt
然后在最后一行写上 ftp -s:job.txt
并将所有行保存为 XXX.bat ,运行就可以自动执行这些操作了。


5、如何登陆服务器并下载最新版本的程序?
这里提供最简单的一种构想,即远端目录下所有文件,都以  XXXX20100312.rar 之类的格式保存,那么只需要修改日期,默认是按照日期先后排列的,那么最后一个文件,就是最新的了,
所以你可以先用例子3生成 e:\bak\filelist.txt 文件,里面最后一行,就是最新的版本的文件名了,在获取到 filelist.txt之后
for /f %%a in (filelist.txt) do set newver=%%a
即可将 newver 变量设置为最后那行文件名,然后再新建一个jobtodo.txt,内容跟job.txt 完全一样,只是将“ls . e:\bak\filelist.txt”替换成 get %newver%,那么就可以下载到你所需要的版本了


附录程序如下:
xxx.bat 内容
echo open 58.61.XXX.XXX>>e:\bak\job.txt
echo username>>e:\bak\job.txt
:注意下面password之后有个空格
echo password >>e:\bak\job.txt
echo hash>>e:\bak\job.txt
echo bin>>e:\bak\job.txt
echo lcd e:\bak>>e:\bak\job.txt
echo cd bak>>e:\bak\job.txt
echo ls . e:\bak\filelist.txt>>e:\bak\job.txt
echo quit>>e:\bak\job.txt
ftp -s:e:\bak\job.txt
在运行xxx.bat之后,可以看到生成了e:\bak\filelist.txt这个文件,然后运行下面的yyy.bat,就能在e:\bak下面找到你要的文件了
yyy.bat 的内容
for /f %%a in (e:\bak\filelist.txt) do set newver=%%a
echo open 58.61.XXX.XXX>>e:\bak\jobtodo.txt
echo username>>e:\bak\jobtodo.txt
echo password >>e:\bak\jobtodo.txt
echo hash>>e:\bak\jobtodo.txt
echo bin>>e:\bak\jobtodo.txt
echo lcd e:\bak>>e:\bak\jobtodo.txt
echo cd bak>>e:\bak\jobtodo.txt
get %newver%>>e:\bak\jobtodo.txt
echo quit>>e:\bak\jobtodo.txt
ftp -s:e:\bak\jobtodo.txt
  
当然,你把以上两段的内容写在一个bat里面,效果是一样的,我分开写只是为了让你明白两个文件内容差异很小,完全可以做成一段,在关键的几个位置加多一个 ! if 命令,看是否 exist 某个文件 的判断就可以了极大的缩小代码尺寸了。

[ Last edited by exzzz on 2010-4-15 at 12:56 ]



  
2010-4-15 12:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

还有下载整个FTP目录、上传本地整个目录、下载指定日期之前的文件、下载几分钟之前的文件等等。



2010-4-15 18:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: