Board logo

标题: [文本处理] [已解决]从FTP上获取当前时间之前一段时间内信息的批处理 [打印本页]

作者: lazygc520    时间: 2009-8-6 14:03     标题: [已解决]从FTP上获取当前时间之前一段时间内信息的批处理

从FTP上获取当前时间之前一段时间内的信息。假设我的FTP上有一个a.txt文件,而且过一段时间FTP上会增加一个类似的*.txt文件,我如何获得本机当前时间的一段时间相应的*.txt文件?

[ 本帖最后由 lazygc520 于 2009-8-24 09:33 编辑 ]
作者: lazygc520    时间: 2009-8-6 14:08

附上我之前的代码,如下的代码得到的是从FTP上获取对应本机时间一天前的相关文件的批处理,我如何修改可获得当天且对应本机现在时间的一段时间之前的对应FTP上的文件信息?假设现在是14:00,我想获得13:00-14:00这段时间内FTP上对应的文件信息。

[ 本帖最后由 lazygc520 于 2009-8-27 15:27 编辑 ]
作者: lazygc520    时间: 2009-8-7 09:43

或者能不能精确到秒,1小时=3600秒。
作者: lazygc520    时间: 2009-8-10 08:28

难道没有人会么?我只想知道时间如何获取,程序大体不用修改。
作者: batman    时间: 2009-8-10 08:44

楼主,不是大家不想回你,因为时间回溯计算是相当复杂的,严格的来说这涉及到闰年的判断(二月天数),长短月的判断(是30天还是31天),时间跨日判断。而论坛关于这方面的贴子实在是不少,楼主为什么不先搜索下呢?
作者: Batcher    时间: 2009-8-12 11:23

这里有现成的计算时间的函数:Ritchie Lawrence 批处理函数库中英文版
http://bbs.bathome.net/thread-3056-1-1.html
作者: lazygc520    时间: 2009-8-13 11:26

感谢Batcher提供的关于时间函数的资料,我把代码做了如下修改,但是还是报错,请看看是什么原因?

[ 本帖最后由 lazygc520 于 2009-8-27 15:27 编辑 ]
作者: lazygc520    时间: 2009-8-13 14:06

  1. (for /f "usebackq tokens=1-9 delims= " %%a in ("%temp%\FileDate.txt") do (
  2.   setlocal enabledelayedexpansion
  3.   if "%%f" equ "Jan" (
  4.     set FileM=01
  5.   ) else if "%%f" equ "Feb" (
  6.     set FileM=02
  7.   ) else if "%%f" equ "Mar" (
  8.     set FileM=03
  9.   ) else if "%%f" equ "Apr" (
  10.     set FileM=04
  11.   ) else if "%%f" equ "May" (
  12.     set FileM=05
  13.   ) else if "%%f" equ "Jun" (
  14.     set FileM=06
  15.   ) else if "%%f" equ "Jul" (
  16.     set FileM=07
  17.   ) else if "%%f" equ "Aug" (
  18.     set FileM=08
  19.   ) else if "%%f" equ "Sep" (
  20.     set FileM=09
  21.   ) else if "%%f" equ "Oct" (
  22.     set FileM=10
  23.   ) else if "%%f" equ "Nov" (
  24.     set FileM=11
  25.   ) else if "%%f" equ "Dec" (
  26.     set FileM=12
  27.   )
  28.   set FileD=10%%g
  29.   set FileD=!FileD:~-2!
  30.   if "!FileM!" equ "%DstMonth%" (
  31.     if "!FileD!" equ "%DstDay%" (
  32.      echo get "%%i" "%DownFolder%\%%i"
  33.     )
  34.   )
  35.   endlocal
  36. ))>>"%ftpDown%"
复制代码
好像这段代码没改对。。。
作者: keen    时间: 2009-8-13 15:14     标题: 回复 8楼 的帖子

当代码有错误,在调试的时候可以去掉@echo off,或者在关键地方加pause,相当于断点调试。

没有太多人会看你的大段的代码,再一个大家没有环境测试你的代码。
作者: lazygc520    时间: 2009-8-13 21:42

希望batcher能够帮我解答一下!!
作者: Batcher    时间: 2009-8-13 23:25

你先运行一下这两个命令,再思考一下时间应该怎样截取吧。
  1. echo %date%
  2. echo %time%
复制代码

作者: lazygc520    时间: 2009-8-14 09:10

不是很理解,愿闻其详。
作者: Batcher    时间: 2009-8-14 09:26

%date%里面只有日期信息,没有时间信息。时间信息在%time%里面。
作者: lazygc520    时间: 2009-8-14 09:30

哦。那是不是我应该对以下部分做修改?
  1. set FileY=%date:~0,4%
  2. call :DateToMins %date:~0,4% %date:~5,2% %date:~8,2% %time:~11,2% %time:~14,2% Mins
复制代码
还有如下部分怎么修改?
  1. (for /f "usebackq tokens=1-9 delims= " %%a in ("%temp%\FileDate.txt") do (
  2.   setlocal enabledelayedexpansion
  3.   if "%%f" equ "Jan" (
  4.     set FileM=01
  5.   ) else if "%%f" equ "Feb" (
  6.     set FileM=02
  7.   ) else if "%%f" equ "Mar" (
  8.     set FileM=03
  9.   ) else if "%%f" equ "Apr" (
  10.     set FileM=04
  11.   ) else if "%%f" equ "May" (
  12.     set FileM=05
  13.   ) else if "%%f" equ "Jun" (
  14.     set FileM=06
  15.   ) else if "%%f" equ "Jul" (
  16.     set FileM=07
  17.   ) else if "%%f" equ "Aug" (
  18.     set FileM=08
  19.   ) else if "%%f" equ "Sep" (
  20.     set FileM=09
  21.   ) else if "%%f" equ "Oct" (
  22.     set FileM=10
  23.   ) else if "%%f" equ "Nov" (
  24.     set FileM=11
  25.   ) else if "%%f" equ "Dec" (
  26.     set FileM=12
  27.   )
  28.   set FileD=10%%g
  29.   set FileD=!FileD:~-2!
  30.   if "!FileM!" equ "%DstMonth%" (
  31.     if "!FileD!" equ "%DstDay%" (
  32.      echo get "%%i" "%DownFolder%\%%i"
  33.     )
  34.   )
  35.   endlocal
  36. ))>>"%ftpDown%"
复制代码
你能不能帮我改下,我比较一下看看是否正确?

[ 本帖最后由 lazygc520 于 2009-8-14 11:13 编辑 ]
作者: lazygc520    时间: 2009-8-14 11:14

batcher,你能否对这个程序解释一下?
作者: lazygc520    时间: 2009-8-14 22:19

小弟不才,对batch的功能还不太了解。麻烦各位高手解答一下主体的程序!
作者: Batcher    时间: 2009-8-14 22:32

%time:~11,2% %time:~14,2%这里对时间的截取是错的,如果你还没有搞清楚字符串截取的方法,可以参考以下几个帖子:

set截取字符详解
http://bbs.bathome.net/viewthread.php?tid=996

set变量字符截取点点通
http://bbs.bathome.net/viewthread.php?tid=40

新手set截取字符练习工具
http://bbs.bathome.net/viewthread.php?tid=1149
作者: lazygc520    时间: 2009-8-15 08:25

原帖由 Batcher 于 2009-8-14 22:32 发表
%time:~11,2% %time:~14,2%这里对时间的截取是错的,如果你还没有搞清楚字符串截取的方法,可以参考以下几个帖子:

set截取字符详解
http://bbs.bathome.net/viewthread.php?tid=996

set变量字符截取点点通
h ...

难道时间格式不是 2009 08 15 08:23 这样的形式么?获取的结果不是%date:~11,2% %date:~14,2%这样的么?
是不是我需要分别获得日期的时间和分钟的时间?象以下这样的格式?
  1. set FileY=%date:~0,4%
  2. set FileN=%time:~0,2%
  3. call :DateToMins %date:~0,4% %date:~5,2% %date:~8,2% %time:~0,2% %time:~3,2% %time:~6,2% Mins
复制代码

[ 本帖最后由 lazygc520 于 2009-8-15 08:38 编辑 ]
作者: Batcher    时间: 2009-8-15 14:28

难道你的%date%环境变量里面包含时间?不是。
是,分别获取年、月、日、时、分。不是,这样取不到时、分。
作者: lazygc520    时间: 2009-8-16 09:15

那应该怎么取?我设2个变量?
能不能举个例子?
我通过以下代码获得的时间信息,不知道这样对不对:
  1. C:\Documents and Settings\usr>echo %date:~0,4% %date:~5,2% %date:~8,2% %time:~0,
  2. 2%:%time:~3,2%
  3. 2009 08 16  9:20
复制代码

[ 本帖最后由 lazygc520 于 2009-8-16 09:24 编辑 ]
作者: lazygc520    时间: 2009-8-17 08:57

以下是程序及输出结果,但是我还是没有获得时间信息文件。请问batcher怎么修改?

[ 本帖最后由 lazygc520 于 2009-8-19 10:19 编辑 ]
作者: Batcher    时间: 2009-8-17 13:16

为什么问了问题不回答呢?不能理解。我觉得既然你回答了我的问题,就应该负责到底啊!一起探讨问题才能共同提高。

最近公司里面事情比较多
既然你不能理解那就等等其他朋友帮你解决问题吧
作者: lazygc520    时间: 2009-8-17 13:18     标题: 回复 22楼 的帖子

唉,问题是后继无人啊!
作者: Batcher    时间: 2009-8-18 09:50

DateToMins函数说明里面写得很清楚,它对传入的参数是这样要求的:
::       %4 待转换的小时,范围是 1/01 到 12 (12小时制,分钟数以“a”或者
::          “p”结尾)或者 0/00 到 23 (24小时制)(传值调用)
::       %5 待转换的分钟,范围是 00-59 (12小时制需加 a/p 后缀)(传值调用)

你截取小时和分钟之后(以24小时制为例),对于小于10的情况(比如9点零5分),需要在左侧补零(比如09和05)
作者: lazygc520    时间: 2009-8-19 09:42

程序我大概读懂了。但是我不清楚传参的时候怎么写?就是你说的补零的情况。还有一个问题,这个DateToMins是日期转分钟的函数,那我可以按小时处理么?怎么处理?
  1. call :DateToMins %date:~0,4% %date:~5,2% %date:~8,2% %time:~0,2% %time:~3,2% //这个传参怎么补零?
复制代码


TempDown.txt的一部分结果:
  1. C:\Documents and Settings\Admin\My Documents>(
  2. setlocal enabledelayedexpansion  
  3. if "Jun" EQU "Jan" (set FileM=01 )  else if "Jun" EQU "Feb" (set FileM=02 )  else if "Jun" EQU "Mar" (set FileM=03 )  else if "Jun" EQU "Apr" (set FileM=04 )  else if "Jun" EQU "May" (set FileM=05 )  else if "Jun" EQU "Jun" (set FileM=06 )  else if "Jun" EQU "Jul" (set FileM=07 )  else if "Jun" EQU "Aug" (set FileM=08 )  else if "Jun" EQU "Sep" (set FileM=09 )  else if "Jun" EQU "Oct" (set FileM=10 )  else if "Jun" EQU "Nov" (set FileM=11 )  else if "Jun" EQU "Dec" (set FileM=12 )  
  4. set FileH=101  //不对,没有补0
  5. set FileH=!FileH:~-2!  
  6. if "!FileM!" EQU "01" (if "!FileH!" EQU "00"/×应该是08,我怎么得到的是00?×/ (echo get "F20090532F.SWM" "E:\\F20090532F.SWM" ) )  
  7. endlocal
  8. )
复制代码

[ 本帖最后由 lazygc520 于 2009-8-19 09:58 编辑 ]
作者: lazygc520    时间: 2009-8-19 10:17

找到一个补零的帖子:
  1. @echo off & setlocal enabledelayedexpansion
  2. set var=2,15,20,33,56,1,07,54,89,66,23,25,27,28,29,55,56,57,5,59,6,78,74,66,08,28,9,30,52,14,15,16,2,8,4,6,15,16,13,5,9
  3. for %%a in (%var%) do (
  4.   if 1%%a lss 20 (set var0=!var0!,0%%a) else set var0=!var0!,%%a
  5. )
  6. set var0=%var0:~1%
  7. echo %var0%
  8. pause
复制代码
但是有处不懂,if 1%%a lss 20 (set var0=!var0!,0%%a) else set var0=!var0!,%%a
为什么是lss 20啊?
作者: Batcher    时间: 2009-8-19 10:24

那个函数库里面没有现成的日期转小时的函数,你有兴趣的话可以自己发明一个出来。

至于补零,可以用“补零”作为关键字在论坛进行搜索,能找到现成的代码。

如果对搜索功能不太熟悉,可以参考:批处理之家论坛使用常见问题FAQ
http://bbs.bathome.net/thread-3473-1-1.html
作者: lazygc520    时间: 2009-8-19 10:31

至于为什么用小时是因为这样的原因:
如果本机时间:10:28,我获取60分钟前的时间信息可以获得。但是只能获取在9:28生成包含时间信息的文件.
我的意思是说能不能获得9:28~10:28之内所有包含时间信息的文件?
作者: Batcher    时间: 2009-8-19 10:38

我觉得转分钟比较合理、简单。
至于你为何无法获取到想要的文件,在没有看到最新代码的前提下,我也不好妄加猜测。
作者: lazygc520    时间: 2009-8-19 10:41

贴出未补零的代码:
  1. rem 假设本机日期格式为yyyy-mm-dd-hh-nn
  2. set FileY=%date:~0,4%
  3. call :DateToMins %date:~0,4% %date:~5,2% %date:~8,2% %time:~0,2% %time:~3,2% Mins
  4. set /a Mins-=MinsAgo
  5. call :MinsToDate %Mins% DstYear DstMonth DstDay DstHour DstMin
复制代码

[ 本帖最后由 lazygc520 于 2009-8-27 15:30 编辑 ]
作者: Batcher    时间: 2009-8-19 11:08

你既然已经知道了不补零算出来的时间肯定是错的,为何还要坚持这样呢?
作者: lazygc520    时间: 2009-8-19 11:11

确实不知道怎么写。能不能举个例子?不会是在%date:~%这样形式的代码中插for循环吧?
作者: Batcher    时间: 2009-8-19 11:18

QQ群里面讨论的挺热闹啊,你不是说已经明白了么?如果还是想不清楚,就让zqz接着讲^_^
作者: lazygc520    时间: 2009-8-19 11:25

是不是这样?
for %%a in (%var%) do (if %%a lss 10 (set var0=!var0!,0%%a) else set var0=!var0!,%%a)
问题是我不知道怎么把它套到程序里。
作者: Batcher    时间: 2009-8-19 12:05

call ateToMins %date:~0,4% %date:~5,2% %date:~8,2% %time:~0,2% %time:~3,2% Mins

在调用函数的时候,使用补零之后的小时和分钟即可。
作者: lazygc520    时间: 2009-8-21 09:55

  1. if %time:~1,1% lss 10 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
  2. echo %hh%
  3. pause
复制代码
我用echo命令查了下,纠正下batcher的错误。小时需要补零,分钟不需要补零,系统会自动补零。

[ 本帖最后由 lazygc520 于 2009-8-21 10:06 编辑 ]
作者: Batcher    时间: 2009-8-21 10:16     标题: 回复 36楼 的帖子

是的,分钟会自动补零。
现在是上午10点多钟,你确认这个代码能够获取正确的小时数?
作者: lazygc520    时间: 2009-8-21 10:20

  1. C:\Documents and Settings\Admin\桌面>if 10 LSS 10 (set hh=00 )  else (set hh=10)
  2. C:\Documents and Settings\Admin\桌面>echo 10
  3. 10
复制代码
这是运行结果。
作者: Batcher    时间: 2009-8-21 10:40

你到底运行的哪个代码?
C:\Test>type test.bat
if %time:~1,1% lss 10 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
echo %hh%

C:\Test>test.bat

C:\Test>if 0 LSS 10 (set hh=00 )  else (set hh=10 )

C:\Test>echo 00
00

作者: lazygc520    时间: 2009-8-21 10:52

哦,写错了!
  1. if %time:~0,2% lss 10 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
  2. echo %hh%
  3. pause
复制代码

作者: Batcher    时间: 2009-8-21 11:10

既然时间截取没有问题了,那就继续检查代码里面有没有其它错误吧。
作者: lazygc520    时间: 2009-8-21 11:25

嗯。现在for循环那里还有些问题,你能不能帮我看看小时的信息如何获取?
FileDate2.txt的格式:
-rw-rw-rw-   1 100      100        22396 Apr 15 14:28 F12345600F.FT2
  1. (for /f "usebackq tokens=1-9 delims=:, " %%a in ("%temp%\FileDate2.txt") do (
  2.   setlocal enabledelayedexpansion /*获取14:28中14的信息*/
  3.   if "%%f" equ "Jan" (
  4.     set FileM=01
  5.   ) else if "%%f" equ "Feb" (
  6.     set FileM=02
  7.   ) else if "%%f" equ "Mar" (
  8.     set FileM=03
  9.   ) else if "%%f" equ "Apr" (
  10.     set FileM=04
  11.   ) else if "%%f" equ "May" (
  12.     set FileM=05
  13.   ) else if "%%f" equ "Jun" (
  14.     set FileM=06
  15.   ) else if "%%f" equ "Jul" (
  16.     set FileM=07
  17.   ) else if "%%f" equ "Aug" (
  18.     set FileM=08
  19.   ) else if "%%f" equ "Sep" (
  20.     set FileM=09
  21.   ) else if "%%f" equ "Oct" (
  22.     set FileM=10
  23.   ) else if "%%f" equ "Nov" (
  24.     set FileM=11
  25.   ) else if "%%f" equ "Dec" (
  26.     set FileM=12
  27.   )
  28.   set FileD=10%%g
  29.   set FileD=!FileD:~-3!
  30.   set FileH=10%%g
  31.   set FileH=!FileH:~-2!
  32.   if "!FileM!" equ "%DstMonth%" (        
  33.   if "!FileD!" equ "%DstDay%" (       /*判断条件是不是还要加上日期的信息?*/
  34.     if "!FileH!" equ "%DstHour%" (
  35.      echo get "%%i" "%DownFolder%\%%i"
  36.     )
  37.   )
  38. )
  39.   endlocal
  40. ))>>"%ftpDown%"
复制代码
主要是以上2点疑问,希望batcher解答一下。

[ 本帖最后由 lazygc520 于 2009-8-21 14:05 编辑 ]
作者: lazygc520    时间: 2009-8-21 14:03

我现在是这样写的:
set FileD=10%%g
set FileD!FileD:~-3!
set FileH=10%%g
set FileH=!FileH:~-2!

然后就报错:环境变量 FileD0xx 没有定义
作者: lazygc520    时间: 2009-8-21 14:10

错误的结果(TempDown2.txt部分内容):
  1. C:\Documents and Settings\Admin\桌面>(
  2. setlocal enabledelayedexpansion  
  3. if "Jun" EQU "Jan" (set FileM=01 )  else if "Jun" EQU "Feb" (set FileM=02 )  else if "Jun" EQU "Mar" (set FileM=03 )  else if "Jun" EQU "Apr" (set FileM=04 )  else if "Jun" EQU "May" (set FileM=05 )  else if "Jun" EQU "Jun" (set FileM=06 )  else if "Jun" EQU "Jul" (set FileM=07 )  else if "Jun" EQU "Aug" (set FileM=08 )  else if "Jun" EQU "Sep" (set FileM=09 )  else if "Jun" EQU "Oct" (set FileM=10 )  else if "Jun" EQU "Nov" (set FileM=11 )  else if "Jun" EQU "Dec" (set FileM=12 )  
  4. set FileD=105  
  5. set FileD!FileD:~-3!  
  6. set FileH=105  
  7. set FileH=!FileH:~-2!  
  8. if "!FileM!" EQU "08" (if "!FileD!" EQU "21" (if "!FileH!" EQU "13" (echo get "59" "E:\\59" ) ) )  
  9. endlocal
  10. )
复制代码
正确的结果内容应该是以下格式:
  1. D:\batch>(
  2. setlocal enabledelayedexpansion  
  3. if "Jun" EQU "Jan" (set FileM=01 )  else if "Jun" EQU "Feb" (set FileM=02 )  else if "Jun" EQU "Mar" (set FileM=03 )  else if "Jun" EQU "Apr" (set FileM=04 )  else if "Jun" EQU "May" (set FileM=05 )  else if "Jun" EQU "Jun" (set FileM=06 )  else if "Jun" EQU "Jul" (set FileM=07 )  else if "Jun" EQU "Aug" (set FileM=08 )  else if "Jun" EQU "Sep" (set FileM=09 )  else if "Jun" EQU "Oct" (set FileM=10 )  else if "Jun" EQU "Nov" (set FileM=11 )  else if "Jun" EQU "Dec" (set FileM=12 )  
  4. set FileD=105  
  5. set FileD=!FileD:~-2!  
  6. if "!FileM!" EQU "08" (if "!FileD!" EQU "20" (if "!FileH!" EQU "hours"(echo get "F12345678K.SWM" "F:\\F12345678K.SWM" ) )  )
  7. endlocal
  8. )
复制代码

作者: kingwu    时间: 2009-8-21 16:02

结果这段代码应该插入到哪里呢?
if %time:~1,1% lss 10 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
作者: lazygc520    时间: 2009-8-21 16:09

set FileY=%date:~0,4%
下面一行,看第2页最下面的一楼。
作者: Batcher    时间: 2009-8-22 04:02     标题: 回复 42楼 的帖子

(for /f "usebackq tokens=1-9 delims=:, " %%a in ("FileDate2.txt") do (

这里为什么要把逗号作为列分隔符之一?

  set FileD=10%%g
  set FileD=!FileD:~-3!
  set FileH=10%%g
  set FileH=!FileH:~-2!

如果以冒号和空格作为列分隔符,日期在第7列,小时在第8列,对吧?那你的FileD和FileH为何都在%%g里面取呢?FileD截取后三位又是出于什么目的呢?
作者: lazygc520    时间: 2009-8-22 23:45

哦,多谢batcher提醒。我知道问题出在哪里了。因为没有搞清楚应用的关系。我再用以下代码试试:
  1. (for /f "usebackq tokens=1-10 delims=: " %%a in ("%temp%\FileDate2.txt") do (
  2.   setlocal enabledelayedexpansion
  3.   if "%%f" equ "Jan" (
  4.     set FileM=01
  5.   ) else if "%%f" equ "Feb" (
  6.     set FileM=02
  7.   ) else if "%%f" equ "Mar" (
  8.     set FileM=03
  9.   ) else if "%%f" equ "Apr" (
  10.     set FileM=04
  11.   ) else if "%%f" equ "May" (
  12.     set FileM=05
  13.   ) else if "%%f" equ "Jun" (
  14.     set FileM=06
  15.   ) else if "%%f" equ "Jul" (
  16.     set FileM=07
  17.   ) else if "%%f" equ "Aug" (
  18.     set FileM=08
  19.   ) else if "%%f" equ "Sep" (
  20.     set FileM=09
  21.   ) else if "%%f" equ "Oct" (
  22.     set FileM=10
  23.   ) else if "%%f" equ "Nov" (
  24.     set FileM=11
  25.   ) else if "%%f" equ "Dec" (
  26.     set FileM=12
  27.   )
  28.   set FileD=10%%g
  29.   set FileD=!FileD:~-2!
  30.   set FileH=10%%h
  31.   set FileH=!FileH:~-2!
  32.   if "!FileM!" equ "%DstMonth%" (        
  33.   if "!FileD!" equ "%DstDay%" (      
  34.     if "!FileH!" equ "%DstHour%" (
  35.      echo get "%%j" "%DownFolder%\%%j"
  36.     )
  37.   )
  38. )
  39.   endlocal
  40. ))>>"%ftpDown%"
复制代码

[ 本帖最后由 lazygc520 于 2009-8-24 09:32 编辑 ]
作者: Batcher    时间: 2009-8-24 23:12

既然问题解决了,何不把代码分享出来,也好让今后遇到此问题的人有个参考?
作者: lazygc520    时间: 2009-8-26 14:20

也好。昨天没上,今天刚看到的帖子。
代码如下:
  1. @echo off
  2. rem 指定FTP用户名
  3. set ftpUser=xxx
  4. rem 指定FTP密码
  5. set ftpPass=xxxxxxx
  6. rem 指定FTP服务器地址
  7. set ftpIP=xxx.xxx.xxx.xx
  8. rem 指定待下载的文件位于FTP服务器的什么位置
  9. set ftpFolder=/export/home/PROD/ntcdata
  10. rem 指定从FTP下载下来的文件存放到什么地方
  11. set DownFolder=E:\
  12. rem 指定下载几小时前的文件
  13. set MinsAgo=60
  14. set ftpDir=%temp%\TempDir2.txt
  15. set ftpDown=%temp%\TempDown2.txt
  16. rem 假设本机日期格式为yyyy-mm-dd-hh-nn        /*本段为时间问题的重点*/
  17. set FileY=%date:~0,4%
  18. if %time:~0,2% lss 10 (set hh=0%time:~1,1%) else (set hh=%time:~0,2%)
  19. call :DateToMins %date:~0,4% %date:~5,2% %date:~8,2% %hh% %time:~3,2% Mins
  20. set /a Mins-=MinsAgo
  21. call :MinsToDate %Mins% DstYear DstMonth DstDay DstHour DstMin
  22. >"%ftpDir%" echo.%ftpUser%
  23. >>"%ftpDir%" echo.%ftpPass%
  24. >>"%ftpDir%" echo bin
  25. >>"%ftpDir%" echo cd "%ftpFolder%"
  26. >>"%ftpDir%" echo dir * "%temp%\FileList2.txt"
  27. >>"%ftpDir%" echo bye
  28. start ftp -v -i -s:"%ftpDir%" %ftpIP%
  29. rem 根据实际情况自行调节延迟时间
  30. ping -n 350 127.1 >nul
  31. findstr /i ":*\.SWM$" "%temp%\FileList2.txt">"%temp%\FileDate2.txt"
  32. findstr /i ":*\.TWM$" "%temp%\FileList2.txt">>"%temp%\FileDate2.txt"
  33. findstr /i ":*\.OWM$" "%temp%\FileList2.txt">>"%temp%\FileDate2.txt"
  34. >"%ftpDown%" echo.%ftpUser%
  35. >>"%ftpDown%" echo.%ftpPass%
  36. >>"%ftpDown%" echo bin
  37. >>"%ftpDown%" echo cd "%ftpFolder%"
  38. (for /f "usebackq tokens=1-10 delims=: " %%a in ("%temp%\FileDate2.txt") do (   /*从filedate2.txt中获得包含时间信息的文件*/
  39.   setlocal enabledelayedexpansion
  40.   if "%%f" equ "Jan" (
  41.     set FileM=01
  42.   ) else if "%%f" equ "Feb" (
  43.     set FileM=02
  44.   ) else if "%%f" equ "Mar" (
  45.     set FileM=03
  46.   ) else if "%%f" equ "Apr" (
  47.     set FileM=04
  48.   ) else if "%%f" equ "May" (
  49.     set FileM=05
  50.   ) else if "%%f" equ "Jun" (
  51.     set FileM=06
  52.   ) else if "%%f" equ "Jul" (
  53.     set FileM=07
  54.   ) else if "%%f" equ "Aug" (
  55.     set FileM=08
  56.   ) else if "%%f" equ "Sep" (
  57.     set FileM=09
  58.   ) else if "%%f" equ "Oct" (
  59.     set FileM=10
  60.   ) else if "%%f" equ "Nov" (
  61.     set FileM=11
  62.   ) else if "%%f" equ "Dec" (
  63.     set FileM=12
  64.   )
  65.   set FileD=10%%g
  66.   set FileD=!FileD:~-2!
  67.   set FileH=10%%h
  68.   set FileH=!FileH:~-2!
  69.   if "!FileM!" equ "%DstMonth%" (        
  70.   if "!FileD!" equ "%DstDay%" (      
  71.     if "!FileH!" equ "%DstHour%" (
  72.      echo get "%%j" "%DownFolder%\%%j"
  73.     )
  74.   )
  75. )
  76.   endlocal
  77. ))>>"%ftpDown%"
  78. >>"%ftpDown%" echo bye
  79. start ftp -v -i -s:"%ftpDown%" %ftpIP%
  80. rem 根据实际情况自行调节延迟时间
  81. rem ping -n 700 127.1 >nul
  82. goto :eof
  83. :DateToMins %yy% %mm% %dd% %hh% %mm%               /*这两段为调用时间函数 日期转分钟和分钟转日期*/
  84. setlocal ENABLEEXTENSIONS
  85. set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5
  86. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  87. set /a dd=100%dd%%%100,mm=100%mm%%%100
  88. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  89. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  90. if 1%hh% LSS 20 set hh=0%hh%
  91. if {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
  92. if {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
  93. if {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
  94. set /a hh=100%hh%%%100,nn=100%nn%%%100,j=j*1440+hh*60+nn
  95. endlocal&set %6=%j%&goto :EOF
  96. :MinsToDate %mins% yy mm dd hh nn
  97. setlocal ENABLEEXTENSIONS
  98. set /a i=%1,nn=i%%60,i/=60,hh=i%%24,dd=i/24,i/=24
  99. set /a a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  100. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  101. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  102. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  103. (if %hh% LSS 10 set hh=0%hh%)&(if %nn% LSS 10 set nn=0%nn%)
  104. endlocal&set %6=%nn%&set %5=%hh%&set %4=%dd%&^
  105. set %3=%mm%&set %2=%yy%&goto :EOF
复制代码

[ 本帖最后由 lazygc520 于 2009-8-26 14:22 编辑 ]
作者: lazygc520    时间: 2009-8-27 15:35

发现有人在baidu里贴于本内容无关的代码,所以我把不需要的代码重新编辑去除了,但是不影响阅读。
作者: canyuexiaolang    时间: 2009-8-28 07:42

看着这些代码就晕。。。




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