写一个bat文件,传两个参数,在两个参数之间循环。参数是日期形式的字符串。下面是代码。
set /a end=20130102
echo 循环开始
for /l %%n in (%begin%,1,%end%) do (
set /a begin_d=%begin:~6,2%
call :xxx
echo 今天是第%%n天
)
echo 循环结束
:xxxecho 执行到call里了
if %begin_d% leq 31 (
echo -------
set /a begin_d=%begin:~6,2%
set /a begin_m=%begin:~4,2%) else (
echo +++++++++
set /a begin_d=01
set /a begin_m=%begin:~4,2%+1)
if %begin_m% leq 12 (
echo --------++++++++++++-----------
set /a begin_m=%begin_m%
set /a begin_y=%begin:~0,4%) else (
echo +++++++++++-----------++++++++++
set /a begin_m=01
set /a begin_y=%begin:~0,4%+1)
在XXX中,为什么判断进入不到else中呢?
麻烦过路的大侠给看看呐 展开
首先说一下问题,
因为在批处理开始执行的时候,每一个引用的变量都会被扩充。
因此重新变量赋值改变后,使用%变量%来引用变量值的话,
得到的会是原来的变量值,启用延迟变量扩充可以解决。
看一个例子:
set var=value
if "%var%"=="value" (
set var=new_value
if "%var%"=="new_value" @echo 看见这个说明新的变量值引用成功。
)
结果是不会看见消息的。
正确做法是
SetLocal EnableDelayedExpansion
set var=value
if "%var%"=="value" (
set var=new_value
if "!var!"=="new_value" @echo 看见这个说明新的变量值引用成功, var:!var!
)
然后是for变量的理解,你对for变量理解有误。在你给出这段代码中,
for变量%%n 是按照循环体(20121231,1,20130102)中设好的范围,
被依次赋值为数字 20121231 到 20130102,
虽然你在do ( ... ) 这部分,通过call调用执行了另一段代码,
但你调用的这部分代码,其实际效果也只是满足IF的条件判断,来新增并赋值了begain_d,begain_m,begain_y 这几个变量而已,没有影响到%%n的值。
所以你在你for语句执行到最后一条命令 echo 今天是第%%n天时,返回给你的只会是
今天是第 20121231 天
今天是第 20121232 天
今天是第 20121233 天
... ...
今天是第 20130102 天
这样的结果。
所以从你的批处理代码中确实没法搞明白你想做什么。
如果是想实现表示日期的数字每日递增,你的FOR循环就已经实现了。
如果是想计算日期差,并不需要用循环来将全部日期都列出一遍。
你可以直接描述一下你具体想通过批处理实现怎样的效果。
以便根据你的描述,重新给出对应的脚本代码
应为早在FOR开始的时候变量就已经固定了。在FOR /L环境不管你变量如何变化对FOR本身毫无影响。
就如你建立文件夹里的子文件夹,不管你如何操作子文件,文件夹的名字都不会改变。。。
要不你直接说你想干嘛吧。我给你写。
我也是刚学这个,菜鸟!
要实现的功能是从数据库中读取两个日期,然后写个for循环,从较小的日期开始,到较大的日期结束,每次加一天。这个是我自己写的,call调用的XXX的功能是让日期能够按照日期的规则加。它现在的变化是:比如20121231,再加一天,变成20121232了。
还是不太懂,
你循环到结束有什么意义?1W多次?
echo 今天是第%%n天。这个是 从开始的时间到结束的时间的第几天。
还是本月的第几天?