标题: [日期时间] 批处理日期截取函数(2007-11-18更新) [打印本页]
作者: youxi01 时间: 2007-11-15 09:08 标题: 批处理日期截取函数(2007-11-18更新)
- @echo off
- Rem ======以下为函数测试代码=====================
- call :SplitDate -Y ok
- echo %ok%
- pause>nul
-
- Rem '///////////////日期截取函数///////////////////////
- Rem 'code by youxi01@bbs.bathome.net modified by 随风;适用于Winxp;
- Rem '===============使用方法===========================
- Rem '1、要调用本段函数,先将标签下::SplitDate所有内容拷贝
- Rem '到对应批处理的pause段下。
- Rem '2、参数解析:OBJ为操作对象,可以为:-Y(年份),-M(月份)
- Rem '-D(日期),Res用来接受传回结果。
- Rem '3、如:Call :SplitDate -y Res,Res中的结果
- Rem '就为:2007
- Rem '==================================================
- :SplitDate OBJ Res
- setlocal
- for /f "delims=-/. tokens=1,2,3" %%i in ("%date:~0,-3%") do (
- set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
- )
- call set var=%%%~1%%
- endlocal&call set %~2=%var%
- 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
::- @echo off
- set m=aaaaaa
- call :SplitDate Y
- echo %y%
- echo %m%
- pause
-
- :SplitDate OBJ Res
- setlocal
- for /f "delims=-/. tokens=1,2,3" %%i in ("%date:~0,-3%") do (
- set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
- )
- endlocal&set "%~1=%y%-%m%-%d%"
- 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 (即:日期)
=============================================================================
代码:- @echo off
- call :SplitDate m ok
- echo %ok%
- pause
-
- :SplitDate OBJ Res
- setlocal
- rem 日期截取函数 作者: youxi01 适用于Winxp;
- for /f "tokens=1-3 delims=-./ " %%i in ("%date:~0,-3%") do (
- set /a Y=%%i,M=100%%j%%100,D=100%%k%%100
- )
- call set var=%%%~1%%
- endlocal&set %2=%var%
- goto :eof
复制代码
[ 本帖最后由 随风 于 2007-11-18 16:27 编辑 ]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |