|
本帖最后由 zhouf 于 2015-9-15 20:00 编辑
批量FTP上传与下载 (不支持SFTP)
应用场景:
环思ERP软件与外部(第三方)系统,双方电子数据交换(EDI);
比如:上海某客户ERP数据,需与美国客户的ERP做EDI,双方系统生成EDI文件后,通过此FTP工具定时同步;
我们可以通过 SQL Server 调用 xp_cmdshell 的方式调用来执行FTP数据上传下载;
DOS 批处理语法:
- hsftp.exe upload
- -s"SERVER:21" -u"UID" [-p"PWD"]
- -fr"D:\EDI\MTL\MTL*.csv"
- -to"/MTL/TMP/"
- [-frDone"D:\EDI\MTL\DONE\"]
- [-toDone"/MTL/"]
- [-frDoneByMonth"yes"]
- [-log"D:\EDI\LOG\upload_20150909.log"]
- hsftp.exe download
- -s"SERVER:21" -u"UID" [-p"PWD"]
- -fr"/BOM/BOM*.csv"
- -to"D:\EDI\BOM\TMP\"
- [-frDone"/BOM/DONE/"]
- [-toDone"D:\EDI\BOM\"]
- [-frDoneByMonth"yes"]
- [-log"D:\EDI\LOG\download_20150909.log"]
复制代码 执行过程:
- 找到[fr]中满足条件的所有文件名;
- 上传或下载到[to]目录中;
- 比较服务器与本地这些文件,找出大小相同的文件名(成功);
- [frDone]存在时,移动以上成功的文件名[fr]->[frDone],
[frDoneByMonth]为“yes”时,以上成功的文件移动至[frDone]下的月份目录,
[frDone]不存在时,从[fr]删除以上成功的文件; - [toDone]存在时,移动以上成功的文件名[to]->[toDone],
- [log]存在时,将以上所有日志保存到此日志文件中;
示例A: 批量上传- @echo off
- hsftp.exe upload -s"192.168.1.2:21" -u"ftpUser" -p"ftpPassword" -fr"D:\EDI\Material\MTRL*.csv" -frDone"D:\EDI\Material\Done\" -to"/Material/TMP/" -toDone"/Material/" -frDoneByMonth"yes" -log"D:\EDI\Log\upload_20150915.log"
- timeout 10
复制代码- 将本地“D:\EDI\Material\”下所有“MTRL*.csv”文件,上传至FTP服务器临时目录“/Material/TMP/”;
此种处理方式为了防止FTP上传过程,只上传了一半,结果网络断开了,所以先上传到临时目录; - 上传完成后,比较文件大小,两者大小一致的文件,视为上传成功:
FTP服务器:移动文件到正式目录“/Material/”;
本地电脑:移动文件到历史目录“D:\EDI\Material\Done\201509”(当参数frDoneByMonth=yes时存放到月份目录); - 保存上传日志至文件“D:\EDI\Log\upload_20150915.log”;
示例B: 批量上传- @echo off
- hsftp.exe upload -s"192.168.1.2:21" -u"ftpUser" -p"ftpPassword" -fr"D:\EDI\Material\MTRL*.csv" -to"/Material/" -log"D:\EDI\Log\upload_20150915.log"
- timeout 10
复制代码- 将本地“D:\EDI\Material\”下所有“MTRL*.csv”文件,上传至FTP服务器正式目录“/Material/”;
此种处理方式可能会造成文件上传一半,被对方的信息系统脏读走了; - 上传完成后,比较文件大小,两者大小一致的文件,视为上传成功:
FTP服务器:不操作;
本地电脑:删除“D:\EDI\Material\”下所有上传成功的“MTRL*.csv”文件; - 保存上传日志至文件“D:\EDI\Log\upload_20150915.log”;
示例C: 批量下载- @echo off
- hsftp.exe download -s"192.168.1.2:21" -u"ftpUser" -p"ftpPassword" -fr"/Product/PROD*.csv" -frDone"/Product/Done/" -to"D:\EDI\Product\TMP\" -toDone"D:\EDI\Product\" -frDoneByMonth"yes" -log"D:\EDI\Log\download_20150915.log"
- timeout 10
复制代码- 将FTP服务器“/Product/”目录下所有“PROD*.csv”文件,下载到本地临时目录“D:\EDI\Product\TMP\”;
- 上传完成后,比较文件大小,两者大小一致的文件,视为上传成功:
FTP服务器:移动文件到历史目录“/Product/Done/”;
本地电脑:移动文件到正式目录“D:\EDI\Product\”; - 保存上传日志至文件“D:\EDI\Log\download_20150915.log”;
日志文件效果:
----------
2015-09-15 17:45:39.561 : 消息:登陆成功(ftp://ftpUser:****@192.168.1.2:21)
2015-09-15 17:45:39.563 : 消息:目录正常(D:\EDI\Product\TMP\,D:\EDI\Product\)
2015-09-15 17:45:39.577 : 消息:目录正常(/Test/Product/,/Test/Product/Done)
2015-09-15 17:45:39.656 : 消息:下载成功(/Test/Product/PROD_20150909_134801.csv=>D:\EDI\Product\TMP\,大小=9868)
2015-09-15 17:45:39.705 : 消息:下载成功(/Test/Product/PROD_20150909_134802.csv=>D:\EDI\Product\TMP\,大小=9564)
2015-09-15 17:45:39.741 : 消息:移动文件(/Test/Product/PROD_20150909_134801.csv,/Test/Product/Done/201509)
2015-09-15 17:45:39.758 : 消息:移动文件(/Test/Product/PROD_20150909_134802.csv,/Test/Product/Done/201509)
2015-09-15 17:45:39.760 : 消息:移动文件(D:\EDI\Product\TMP\PROD_20150909_134801.csv,D:\EDI\Product\)
2015-09-15 17:45:39.763 : 消息:移动文件(D:\EDI\Product\TMP\PROD_20150909_134802.csv,D:\EDI\Product\)
2015-09-15 17:45:39.764 : 消息:下载完毕,共 2 个文件
---------- |
|