Board logo

标题: [已解决]批处理怎样传送数据给FTP服务器以保证数据安全? [打印本页]

作者: jackjh    时间: 2009-12-16 21:09     标题: [已解决]批处理怎样传送数据给FTP服务器以保证数据安全?

各位高手:
  您好!本人需要编一个数据传送上FTP服务器的脚本文件,因本人是刚学批处理不久,还不能独立编写,求各位高手多多指教!先行谢谢!
本人电脑有一个软件会生成STD类型的文件,需要上传到指定的FTP服务器上面以作保存分析用。所用的系统有WIN 95/NT/XP(如有可能,可以编写一个可以在UNIX 系统下运行的脚本)

BAT程序要求如下:(目的是把同一个文件夹里面所有生成的STD文件完整地上传到FTP服务器)(比如:我的STD文件保存在C:\AB,LOG文件也最好能把它放进C.)

1. 检测本电脑IP(192.168.1.5)地址,若发现有改变现象,则保存到LOG日志文件中。
2. 检测网络(如可PING10.94.1.7 )是否通畅,如有故障,请提示网络有问题。
3. 检测数据,如找到完整的STD数据,则上传到FTP197.198.134.105)中保存分析。上传完后要直接删除STD数据文件.不能删掉别的正在生成的STD文件.因为有很多别的STD文件在时刻生成.
4. STD 数据生成过程较慢,有时一个小时或更久,因此在选择传送时,不能把生成一半的STD文件传上去,这样会影响STD文件的继续生成,如何能实现这样数据不被破坏而又能完整生成完整传送STD的功能。数据必须每天24小时传送。保证数据安全不会丢失.

因为这种STD文件一旦开始生成,只生成一半左右,就被上传(因为好像生成一半时也可以被上传),这样会造成上传的数据不完整,而且刚被上传的STD数据不会再重新生成,因此,一定要等到生成完毕后才能传送为最佳。分析判断数据时,我经常是这样判断数据,根据文件的大小,一开始生成时,会比较小,几个KB左右,完成时有几个M左右。因此通过比较文件的大小并且加上时间的限制才行,比较一段时间(一个小时左右),如果没有发现大小的改变,则认为是完成生成STD文件了的。(如您有更好的检测完整的数据分析更好).

5.关于每次生成的STD文件的命名名称(如test123.STD)都完全不一样.所以每次上传时都不会覆盖前一次上传的STD.
C:\AB\下面有很多STD文件,而且命名都不一样。(批处理可以用通配符识别 *.STD或可以想出更好的办法识别?)
如果STD 完全生成完毕,全都都要上传。是的,每个STD文件都需单独判断是否生成完毕然后单独或一起上传STD文件只要生成完毕,就全部上传.

谢谢你的理解和支持!














[ 本帖最后由 jackjh 于 2009-12-23 00:01 编辑 ]
作者: Batcher    时间: 2009-12-16 22:38

“上传完后要直接删除STD数据文件,而不破坏文件生成”,这句话改怎么理解?
“不能把生成一半的STD文件传上去”,你通常如何判断STD数据生成完毕?
作者: jackjh    时间: 2009-12-16 23:23

“上传完后要直接删除STD数据文件,而不破坏文件生成”,这句话改怎么理解?
因为这种STD文件一旦开始生成,只生成一半左右,就被上传(因为好像生成一半时也可以被上传),这样会造成上传的数据不完整,而且不会再重新生成STD,因此,一定要等到生成完毕后才能传送为最佳的。

“不能把生成一半的STD文件传上去”,你通常如何判断STD数据生成完毕?是的,不能传送一半的数据,我经常是这样判断数据的,根据文件的大小,一开始生成时,会比较小,几个KB左右,完成时有几个M左右。我觉得通过比较文件的大小并且加上时间的限制才行,比较一段时间(一个小时吧),如果没有发现大小的改变,则认为是完成生成STD文件了的。谢谢你的理解和支持!



作者: Batcher    时间: 2009-12-17 00:18

每次生成的STD数据文件文件名称都一样?那岂不是后面一次上传会覆盖前面一次上传?
作者: jackjh    时间: 2009-12-17 22:31

对了,我忘了提醒了,每次生成的STD文件的命名都完全不一样的.所以每次上传时都不会覆盖前一次上传的STD.
作者: Batcher    时间: 2009-12-18 00:09     标题: 回复 5楼 的帖子

每次生成的STD文件的命名都完全不一样的,那批处理怎么知道每次STD叫什么名字?
C:\AB\下面只有一个STD文件?
作者: jackjh    时间: 2009-12-18 12:17

每次生成的STD文件的命名都完全不一样的,那批处理怎么知道每次STD叫什么名字? C:\AB\下面只有一个STD文件?

C:\AB\下面有很多STD文件,而且命名都不一样。批处理可以用通配符识别。怎么编不清楚呢?
作者: Batcher    时间: 2009-12-18 12:29     标题: 回复 7楼 的帖子

有很多STD文件,而且命名都不一样,那到底要上传哪个呢?
每个STD文件都需单独判断是否生成完毕然后单独上传?
作者: jackjh    时间: 2009-12-18 15:09

有很多STD文件,而且命名都不一样,

如果STD 完全生成完毕,都要上传。是的,每个STD文件都需单独判断是否生成完毕然后单独或一起上传。
作者: Batcher    时间: 2009-12-18 18:10

好的,我基本上知道该怎么写代码了。
你能否把3、5、7、9楼的问题描述全部更新到顶楼?以便他人查看。
作者: jackjh    时间: 2009-12-19 18:06     标题: 回复 10楼 的帖子

管理员,你好!
现在代码怎么样了呢?能否发出来一下?
作者: jackjh    时间: 2009-12-21 22:14     标题: 回复 10楼 的帖子

batcher 大哥,
能不能帮忙写出这段代码呢,我一直在等着,期望你的好消息.
作者: Batcher    时间: 2009-12-22 21:37

StdCheck.bat
  1. @echo off
  2. set StdFolder=C:\AB
  3. set LogFile=%StdFolder%\Std.log
  4. set LocalIP=192.168.1.5
  5. set RemoteIP=10.94.1.7
  6. :Init
  7. rem 检查本电脑IP地址是否有改变
  8. for /f "tokens=2 delims=:" %%a in ('ipconfig^|findstr "IP.*Address"') do (
  9.     set LocalIP=%%a
  10. )
  11. set LocalIP=%LocalIP: =%
  12. if "" neq "" (
  13.     >>"%LogFile%" echo [%date% %time%]本电脑IP地址变为:%LocalIP%
  14. )
  15. rem 检查网络是否畅通
  16. ping -n 1 -l 1 %RemoteIP% >nul 2>&1 || >>"%LogFile%" echo [%date% %time%]网络有问题 && goto :Init
  17. rem 检查STD数据文件是否生成完毕
  18. setlocal enabledelayedexpansion
  19. for %%a in ("%StdFolder%\*.std") do (
  20.     set StdSizeNow_%%~na=0
  21.     set StdSizeLast_%%~na=0
  22. )
  23. :CheckStd
  24. for %%a in ("%StdFolder%\*.std") do (
  25.     set StdSizeNow_%%~na=%%~za
  26.     if "!StdSizeNow_%%~na!" neq "0" (
  27.         if "!StdSizeLast_%%~na!" neq "0" (
  28.             if "!StdSizeNow_%%~na!" equ "!StdSizeLast_%%~na!" (
  29.                 rem 假设系统日期格式是:yyyy-mm-dd weekday
  30.                 rem 根据当前的系统日期时间对待上传的STD数据文件进行归档
  31.                 set StdAchive=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.std.bak
  32.                 ren "%%a" "%StdAchive%"
  33.                 start StdUpload.bat "%StdFolder%" "%StdAchive%"
  34.                 ping -n 3600 127.1 >nul 2>&1
  35.                 goto :Init
  36.             )
  37.         ) else (
  38.             set StdSizeLast_%%~na=!StdSizeNow_%%~na!
  39.         )
  40.     )
  41. )
  42. endlocal
  43. ping -n 3600 127.1 >nul 2>&1
  44. goto :CheckStd
复制代码
StdUpload.bat
  1. @echo off
  2. rem 上传STD数据到FTP
  3. set ftpUser=USERNAME
  4. set ftpPass=PASSWORD
  5. set ftpIP=197.198.134.105
  6. rem 假设系统日期格式是:yyyy-mm-dd weekday
  7. set ftpFile=%~1\FTP%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%.txt
  8. >"%ftpFile%" echo,%ftpUser%
  9. >>"%ftpFile%" echo,%ftpPass%
  10. >>"%ftpFile%" echo bin
  11. >>"%ftpFile%" echo put "%~1\%~2"
  12. >>"%ftpFile%" echo bye
  13. start ftp -v -i -s:"%ftpFile%" %ftpIP%
复制代码

作者: jackjh    时间: 2009-12-22 23:59

batcher 大哥,
谢谢您! 我从你的文章上尝到了很多有用的东西,真的好佩服你啊,以后更要向你多多学习!多多交流!这么好的论坛,我是来对了, 我以后要认真对待,刻苦学习P技术啊.我建议以后一个QQ群专门交流批处理技术问题.
作者: Batcher    时间: 2009-12-23 13:00     标题: 回复 14楼 的帖子

论坛有QQ群:
http://bbs.bathome.net/announcement.php?id=3#3




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2