中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 如何在循环中使用Call命令? 上一主题 | 下一主题
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『楼 主』:  如何在循环中使用Call命令?

在我作的批处理中需要判断多年的闰年和平年情况,一下是我的批处理程序:
@echo off
set /a year_begin=1948
set /a year_end=2006
set /a loop=%year_begin%-1

setlocal EnableDelayedExpansion
for /l %%i in (%year_begin%,1,%year_end%) do (
         set /a loop+=1
         set /a a=!loop! %% 4
         set /a b=!loop! %% 100
         set /a c=!loop! %% 400
         set /a daynum=365
                  if "!a!"=="0" (
                                           if not "!b!"=="0" set /a daynum=366
                                           if "!c!"=="0" set /a daynum=366
                   ) else set /a daynum=365
         echo !loop! !daynum!                                  )
以上是我作试验用的批处理,结果正确,可以运行,但是由于还要在for命令中嵌套很多其它的命令,所以我把判断闰年的部分写成调用的形势。我尝试的方案如下:

::@echo off
set /a year_begin=1948
set /a year_end=2006
set /a loop=%year_begin%-1
set /a daynum=365

setlocal EnableDelayedExpansion
for /l %%i in (%year_begin%,1,%year_end%) do (
         set /a loop+=1
         call :leap !loop! !daynum!
         echo !loop! !daynum!     )

:leap         
::判断润年和平年
echo %1 %2
@echo off
set /a a=%1 %% 4
set /a b=%1 %% 100
set /a c=%1 %% 400
set /a %2=365
         if "!a!"=="0" (
                               if not "!b!"=="0" set /a %2=366
                               if "!c!"=="0" set /a %2=366
         ) else set /a %2=365
其中的daynum是我想得到的结果,但是运行的时候总是显示找不到操作数,请各位高人指点一二!

2007-6-16 14:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 2 楼』:  

不好意思。是偶错了。:-)
::@echo off
set /a year_begin=1948
set /a year_end=2006
set /a loop=%year_begin%-1
set /a daynum=365

setlocal EnableDelayedExpansion
for /l %%i in (%year_begin%,1,%year_end%) do (
         set /a loop+=1
         call :leap loop daynum
         echo !loop! !daynum!     )
pause
:leap         
::判断润年和平年
echo %1 %2
@echo off
set /a a=%1 %% 4
set /a b=%1 %% 100
set /a c=%1 %% 400
set %2=365
         if "!a!"=="0" (
                               if not "!b!"=="0" set %2=366
                               if "!c!"=="0" set %2=366
         ) else set %2=365
[ Last edited by wudixin96 on 2007-6-16 at 07:22 PM ]

2007-6-16 15:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 3 楼』:  

我只是给%2赋值了,%1并没有赋值啊,不过我在分步测试的时候确实在set /a a=%1 %% 4时就有了问题,但是有其它的可以调用的方式么,请赐教!

2007-6-16 15:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 4 楼』:  

@echo off
set /a i = 19
set /a j = 12
call:fun i j answer
echo %answer%
goto :EOF

:fun
set /a answer = %1+%2
goto :EOF
这个例子是我从http://www.cn-dos.net/forum/view ... &highlight=call摘抄的,试验也是通过的,感觉上思路上没有问题啊!

2007-6-16 16:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 5 楼』:  

其实写成这样,运行时容易理解点。
::@echo off
set /a year_begin=1948
set /a year_end=2006
set /a loop=%year_begin%-1
set /a daynum=365

for /l %%i in (%year_begin%,1,%year_end%) do (
         set /a loop+=1
         call :leap loop daynum
         call echo %%loop%% %%daynum%%     )
pause
:leap         
::判断润年和平年
echo %1 %2

set /a a=%1 %% 4
set /a b=%1 %% 100
set /a c=%1 %% 400
set %2=365
         if "%a%"=="0" (
                               if not "%b%"=="0" set %2=366
                               if "%c%"=="0" set %2=366
         ) else set %2=365


2007-6-16 19:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 6 楼』:  

谢谢指教,执行终于通过了!

2007-6-17 20:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 7 楼』:  

哦!还想再请教一下,为什么在我运行结束(运行结果正确)后总是显示3个连续的找不到操作数和两个命令语法不正确!百思不得其解。

2007-6-17 20:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 8 楼』:  

偶这运行没问题的。

可以试着把@echo off注释掉,查看代码执行过程

2007-6-18 08:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 9 楼』:  

我去掉后发现在执行完最后一年(2006)的判断后,看起来DOS还是执行了一次leap部分,我用的操作系统是winXP

2007-6-18 10:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wjj137404
初级用户





积分 26
发帖 10
注册 2006-8-23
状态 离线
『第 10 楼』:  

找到原因了,忘了加goto :EOF,再次感谢!

2007-6-19 10:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: