Board logo

标题: [日期时间] 批处理日期截取函数(2007-11-18更新) [打印本页]

作者: youxi01    时间: 2007-11-15 09:08     标题: 批处理日期截取函数(2007-11-18更新)

  1. @echo off
  2. Rem ======以下为函数测试代码=====================
  3. call :SplitDate -Y ok
  4. echo %ok%
  5. pause>nul
  6. Rem '///////////////日期截取函数///////////////////////
  7. Rem 'code by youxi01@bbs.bathome.net modified by 随风;适用于Winxp;
  8. Rem '===============使用方法===========================
  9. Rem '1、要调用本段函数,先将标签下::SplitDate所有内容拷贝
  10. Rem '到对应批处理的pause段下。
  11. Rem '2、参数解析:OBJ为操作对象,可以为:-Y(年份),-M(月份)
  12. Rem '-D(日期),Res用来接受传回结果。
  13. Rem '3、如:Call :SplitDate -y Res,Res中的结果
  14. Rem '就为:2007
  15. Rem '==================================================
  16. :SplitDate OBJ Res
  17. setlocal
  18. for /f "delims=-/. tokens=1,2,3" %%i in ("%date:~0,-3%") do (
  19.     set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
  20. )
  21. call set var=%%%~1%%
  22. endlocal&call set %~2=%var%
  23. goto :eof
复制代码

作者: 随风    时间: 2007-11-16 01:41

呵呵,youxi 兄,在下又要多言了。
  代码测试出错,原因有两个。
一、在用set /a 的时候,好像变量名中不能含有“运算符”否则提示,运算符不存在
二、你在修改了代码后没有注意,call set ....这一句完全是错的。
三、还是那个老问题,就拿你这段代码来说,你的函数中分别用了y,m,d作为变量名,
    但是如果我在代码的开头,已经给变量y,m赋了值的话,那么一但调用了你的函数,
    我原来赋的值就 化为乌有 了。而别人要用你的“函数”是不可能先去研究你的代码的。
    当然,用生僻的变量名,是一个办法,但始终有缺陷。
四、我的建议:
       既然是“封装函数”就要做到“绝对”的不与代码发生冲突,
    解决方法:在标签下,先开启“本地变量”到结束时再充分利用“变量延迟”的原理
    在结束“本地变量”之前,给call的参数赋值。这样一来,你的标签下面就可以使用任意变量名
    而不用考虑与原来的代码冲突问题。

表达能力太差了,不知道,说明白没有。

测试代码如下,在使用call之前,已经设变量m等于aaaaaa,而在你的函数中也使用了m作为变量,
  测试结果,m的值在你的“函数”中是月份,在回到call处后,仍是call之前的值 aaaaaa

::
  1. @echo off
  2. set m=aaaaaa
  3. call :SplitDate Y
  4. echo %y%
  5. echo %m%
  6. pause
  7. :SplitDate OBJ Res
  8. setlocal     
  9. for /f "delims=-/. tokens=1,2,3" %%i in ("%date:~0,-3%") do (
  10.   set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
  11. )
  12. endlocal&set "%~1=%y%-%m%-%d%"
  13. goto :eof
复制代码

[ 本帖最后由 随风 于 2007-11-16 05:14 编辑 ]
作者: 随风    时间: 2007-11-18 16:18

整理 youxi01 的函数。
        感觉这样更通俗易懂些。
================================ 使用方法  =================================
1、要调用本段函数,先将代码从:SplitDate开始及以下所有内容拷贝到批处理中即可。

2、调用方法:   call :SplitDate Y ok
      :SplitDate为标签名,也可以自己定义.
      Y 为call 的第一个参数,只能是Y  M  D “Y表示(年份),M(月份) D(日期)”
      ok 为call 的第二个参数,代表变量名,%ok%就是这段函数运行后得到的结果.
      参数不区分大小写,得到结果都去掉了首位的0

3、如:当前日期为 2007-18-05
            Call :SplitDate y Res,变量 Res 的结果就为:2007 (即:年份
            Call :SplitDate d Res,变量 Res 的结果就为:5 (即:日期
=============================================================================

代码:
  1. @echo off
  2. call :SplitDate m ok
  3. echo %ok%
  4. pause
  5. :SplitDate OBJ Res
  6. setlocal
  7. rem 日期截取函数 作者:  youxi01  适用于Winxp;
  8. for /f "tokens=1-3 delims=-./ " %%i in ("%date:~0,-3%") do (
  9.     set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
  10. )
  11. call set var=%%%~1%%
  12. endlocal&set %2=%var%
  13. goto :eof
复制代码

[ 本帖最后由 随风 于 2007-11-18 16:27 编辑 ]




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