Board logo

标题: [日期时间] 批处理命令FOR循环里面定义变量取值错误 [打印本页]

作者: Forever520    时间: 2015-7-29 11:18     标题: 批处理命令FOR循环里面定义变量取值错误

想定功能:
    在FOR循环了进行某个操作(如导出数据库表数据),想输出记录一下没一次操作的开始结束时间。
问题点:
    执行了下面的代码后,发现在FOR循环里面重新定义的变量【nowtime】的值,每次都是取的FOR循环外面定义的同名变量【nowtime】的值。
    发下这个问题后,做了一下还尝试:
       1、怀疑同名变量的问题。把FOR循环里面的变量名改变一下【set nowtime1=%time: =0%】,但是发现输出【2015/07/29 ~,8 】。还是有问题。
       2、怀疑执行时间短,瞬间执行完了。每次PAUSE暂停几秒,但是问题依旧。

求助事项:
    请各位看看我的代码有什么问题,以及如何实现我要求的功能。

代码如下:
--------------------------------------------------------------------代码开始(本行非代码行)--------------------------------------------------------------------
  1. @ECHO OFF & setlocal EnableDelayedExpansion
  2. TITLE test
  3. ECHO ##***************************************************************************## > log.txt
  4. REM BAT运行开始时间记录
  5. set nowtime=%time: =0%
  6. ECHO %date% %nowtime:~,8% >> log.txt
  7. ECHO .>> log.txt
  8. SET COUNT=0
  9. FOR %%i IN (1,2,3,4,5,6,7,8,9,10) DO (
  10. SET /A COUNT+=1
  11. ECHO No.!COUNT! [%%i] >> log.txt
  12. REM 处理开始时间记录
  13. set nowtime=%time: =0%
  14. ECHO %date% %nowtime:~,8% >> log.txt
  15. REM 暂停处理
  16. PAUSE
  17. REM 处理结束时间记录
  18. set nowtime=%time: =0%
  19. ECHO %date% %nowtime:~,8% >> log.txt
  20. )
  21. ECHO . >> log.txt
  22. REM BAT运行结束时间记录
  23. set nowtime=%time: =0%
  24. ECHO %date% %nowtime:~,8% >> log.txt
  25. ECHO ##***************************************************************************## >> log.txt
  26. PAUSE>nul
  27. @ECHO ON
复制代码
--------------------------------------------------------------------代码结束(本行非代码行)--------------------------------------------------------------------

实行结果如下:
--------------------------------------------------------------------结果开始(本行非结果行)--------------------------------------------------------------------
##***************************************************************************##
2015/07/29 10:17:00
.
No.1 [1]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.2 [2]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.3 [3]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.4 [4]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.5 [5]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.6 [6]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.7 [7]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.8 [8]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.9 [9]
2015/07/29 10:17:00
2015/07/29 10:17:00
No.10 [10]
2015/07/29 10:17:00
2015/07/29 10:17:00
.
2015/07/29 10:17:04
##***************************************************************************## --------------------------------------------------------------------结果结束(本行非结果行)--------------------------------------------------------------------
作者: flyinnet9    时间: 2015-7-29 11:32

输出当前时间直接echo %date% %time:~0,8%
作者: Forever520    时间: 2015-7-29 11:42

回复 2# flyinnet9


   【输出当前时间直接echo %date% %time:~0,8%】这样写在循环里面是可以输出时间的,但是10次循环输出的时间是一样的,并非当前时间。
    在循环里面正确的写法是 【CALL ECHO %%date%% %%time:~0,8%%】这样输出的时间每次不一样,为真正的当前时间。
  
    为什么定义变量就不行了?
作者: pcl_test    时间: 2015-7-29 12:51

开了变量延迟就该利用
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /l %%a in (1 1 100) do echo;!time!
  3. pause
复制代码

作者: Forever520    时间: 2015-7-29 13:37

回复 4# pcl_test


   
开了变量延迟就该利用
一语惊醒梦中人,还是自己学艺不精。
     多谢!
     setlocal EnableDelayedExpansion 开启变量延迟后,需要使用“!”来引用变量。
     修改后的代码:
--------------------------------------------------------------------代码开始(本行非代码行)--------------------------------------------------------------------
  1. @ECHO OFF & setlocal EnableDelayedExpansion
  2. TITLE test
  3. ECHO ##***************************************************************************## > log.txt
  4. REM BAT运行开始时间记录
  5. set nowtime=%time: =0%
  6. ECHO %date% %nowtime:~,8% >> log.txt
  7. ECHO .>> log.txt
  8. SET COUNT=0
  9. FOR %%i IN (1,2,3,4,5,6,7,8,9,10) DO (
  10. SET /A COUNT+=1
  11. ECHO No.!COUNT! [%%i] >> log.txt
  12. REM 处理开始时间记录
  13. set nowtime=!time: =0!
  14. ECHO !date! !nowtime:~,8! >> log.txt
  15. REM 暂停处理
  16. PAUSE
  17. REM 处理结束时间记录
  18. set nowtime=!time: =0!
  19. ECHO !date! !nowtime:~,8! >> log.txt
  20. )
  21. ECHO . >> log.txt
  22. REM BAT运行结束时间记录
  23. set nowtime=%time: =0%
  24. ECHO %date% %nowtime:~,8% >> log.txt
  25. ECHO ##***************************************************************************## >> log.txt
  26. PAUSE>nul
  27. @ECHO ON
复制代码
--------------------------------------------------------------------代码结束(本行非代码行)--------------------------------------------------------------------

修改后实行结果:
--------------------------------------------------------------------结果开始(本行非结果行)--------------------------------------------------------------------
  1. ##***************************************************************************##
  2. 2015/07/29 13:23:24
  3. .
  4. No.1 [1]
  5. 2015/07/29 13:23:24
  6. 2015/07/29 13:23:27
  7. No.2 [2]
  8. 2015/07/29 13:23:27
  9. 2015/07/29 13:23:29
  10. No.3 [3]
  11. 2015/07/29 13:23:29
  12. 2015/07/29 13:23:30
  13. No.4 [4]
  14. 2015/07/29 13:23:30
  15. 2015/07/29 13:23:32
  16. No.5 [5]
  17. 2015/07/29 13:23:32
  18. 2015/07/29 13:23:33
  19. No.6 [6]
  20. 2015/07/29 13:23:33
  21. 2015/07/29 13:23:35
  22. No.7 [7]
  23. 2015/07/29 13:23:35
  24. 2015/07/29 13:23:37
  25. No.8 [8]
  26. 2015/07/29 13:23:37
  27. 2015/07/29 13:23:39
  28. No.9 [9]
  29. 2015/07/29 13:23:39
  30. 2015/07/29 13:23:40
  31. No.10 [10]
  32. 2015/07/29 13:23:40
  33. 2015/07/29 13:23:41
  34. .
  35. 2015/07/29 13:23:41
复制代码
##***************************************************************************##
--------------------------------------------------------------------结果结束(本行非结果行)--------------------------------------------------------------------




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