|
kidzgy
中级用户
积分 262
发帖 129
注册 2007-7-11
状态 离线
|
『第
31 楼』:
我可是在20楼 点击 [Copy to clipboard] 复制到文本里去,然后改扩展名。
怎么会没有问题呢?你试着重新复制你自己的代码到bat中去,然后运行,输入里面所举的例子,会提示错误的。此时错误的界面一直是个循环,不管你按任意键,还是一样。
|
|
2007-8-2 07:19 |
|
|
qzwqzw
银牌会员
天的白色影子
积分 2342
发帖 635
注册 2004-3-6
状态 离线
|
『第
32 楼』:
应该是你的情况比较特殊一些
我和早前的namejm讨论都没有遇到这个问题
这次为了测试特意使用IE打开了这个页面
试了 [Copy to clipboard] 功能
也没有任何问题
所以请还是按照的建议插入调试语句看看结果再说
|
|
2007-8-2 07:55 |
|
|
frankkf
初级用户
积分 88
发帖 43
注册 2007-5-30
状态 离线
|
『第
33 楼』:
[Copy to clipboard] 功能应该没问题
以前一些code我也用的是[Copy to clipboard] 功能
那qzwqzw用什么看网页?
firefox或者是opera?~~
|
|
2007-8-2 13:31 |
|
|
kidzgy
中级用户
积分 262
发帖 129
注册 2007-7-11
状态 离线
|
|
2007-8-2 16:47 |
|
|
qzwqzw
银牌会员
天的白色影子
积分 2342
发帖 635
注册 2004-3-6
状态 离线
|
『第
35 楼』:
非常感谢你的报告!
因此我又揭开了微软cmd的一个secret
解决你的问题方法很简单
请将你的代码文件扩展名改为.cmd
或者在代码中的set /a前加上一句 cd. 以复位错误号为0
==================================
现在描述一下解决问题的过程
首先下载到你的测试文件后
测试运行果然发现你所述的问题
然后我对问题代码与我的正常运行的源代码进行比较
发现问题代码分别在第2行和第一个goto Main所在行行尾多出两个空格
因为第2个空格位置的特殊性
我以为找到了问题所在
因为我使用的是EditPlus编辑源代码
它保存代码时会自动清除行尾的空格
而帖出去的代码很可能是因为使用了其它编辑器修改后多出来的
然而我在去除掉多余空格测试却发现问题依然存在
再次二进制比较两个代码文件的结果是完全一致
然后我开始漫长的跟踪调试
我发现问题代码总是在因为一次set /a的错误产生错误号9167后
不会再因为正确的set /a而复位错误号0
而正常代码就无此问题
经过再三的思索
终于确定这个问题与文件扩展名相关
也就是说,
在.bat文件中set 产生的错误总不会被set所复位
而在.cmd文件中则是可以的
以下是一段测试代码
将它分别保存为.bat和.cmd文件进行测试后发现
二者结果不同
至此问题基本明晰
@echo off
set /a ii=23 + 12
echo %errorlevel%.
set /a ii=23 + 09
echo %errorlevel%.
echo %errorlevel%.
set ii=23
echo %errorlevel%.
pause 但是至于这个问题的深层原因尚没有找到
这个留待有心人继续探索
而且我在EditPlus的工具栏中运行.bat文件并没有遇到此问题
|
|
2007-8-3 07:03 |
|
|
kidzgy
中级用户
积分 262
发帖 129
注册 2007-7-11
状态 离线
|
『第
36 楼』:
那请你更新一下20楼的代码,以至于更完善一点。
不管在bat还是cmd中,能够保证正常运行就够了。
|
|
2007-8-3 20:04 |
|
|
kidzgy
中级用户
积分 262
发帖 129
注册 2007-7-11
状态 离线
|
『第
37 楼』:
还是有错误,还是保存到BAT的时候,输入07-02-03提示错误。
我是复制20楼的代码到BAT中和CMD中分别测试的。
|
|
2007-8-4 18:05 |
|
|
qzwqzw
银牌会员
天的白色影子
积分 2342
发帖 635
注册 2004-3-6
状态 离线
|
『第
38 楼』:
问题已经查明
仍然是set的errorlevel问题
至于问题的细节
和代码的修改
就留给你当今晚的作业吧
也算考一考你对这个问题的认识
|
|
2007-8-4 19:02 |
|
|
kidzgy
中级用户
积分 262
发帖 129
注册 2007-7-11
状态 离线
|
『第
39 楼』:
不会吧,我对批处理不是很熟悉啊,不像你们那么懂得资深。
如果叫我测试那还行,如果叫我修复问题,那简直是为难我。。
|
|
2007-8-4 19:14 |
|
|
zjl5
初级用户
积分 82
发帖 15
注册 2007-5-26
状态 离线
|
『第
40 楼』:
qzwqzw兄可能太忙了...
我就针对症状改改吧.可能会引出更多的问题呵~`
另外加入了 针对农历的生肖和干支年计算.
:: 月历查询工具 中国DOS联盟专用版 转载请注明版权
:: 原创:zjl5 更新:namejm, qzwqzw 2007-06-03
:: 算法:基姆拉尔森计算公式
:: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
:: 把一月和二月看成是上一年的十三月和十四月
:: 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
:: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
:: 在日历里面,★=当天
:: 支持多种格式的日期输入:
:: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
:: ② 若输入两个数,则认为是查询年和月,★标在1日上;
:: ③ 输全的话,★标在指定日期上
:: 关于年份的转换:
:: ① 若年份上输入的数字少于三位,则作如下转换:
:: 50~99判定为19xx
:: 0~49判定为20xx
:: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
:: 按 ① 的规则计算该年份的日期;
@echo off
color 3F
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六
set sdate=%date%
:Main
cls&echo.
:: 日期提取、格式化与校验
for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
(set sy=%%i) && (set sm=%%j) && (set sd=%%k))
if %sm% geq 13 (echo 错误的日期.&pause>nul&(set sdate=%date%)&pause>nul&goto :main)
if %sd% geq 32 (echo 错误的日期.&pause>nul&(set sdate=%date%)&pause>nul&goto :main)
if not defined sd set sd=1
if not defined sm set sm=%sy%& set sy=%date:~0,4%
(set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
(set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
if %y% lss 100 (
if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc
:Calc
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1!
:: 计算每个月的天数
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 计算2月份的偏差
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% equ 2 set /a days=28+%leap%
if %m% leq 2 (set /a y-=1& set /a m+=12)
:: 计算指定日期的星期数
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
echo. %sy%年%sm%月 查询日:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月历
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo. 日 一 二 三 四 五 六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= <nul
for /l %%i in (0,1,37) do (
set "temp= "
if %%i GTR %wb% if %%i LSS %we% (
set temp= !day!
set temp=!temp:~-2!
if !d! EQU !day! set temp=★
set /a day+=1
)
set /p= !temp!<nul
set /a "wm=(%%i+1)%%7"
if !wm! equ 0 echo.&echo.&set /p= <nul
)
echo.
echo ━━━━━━━━━━━━━━━━━━━
echo. 输入日期可查询当日星期并显示当月月历
echo.
set sdate=
set /p sdate= 格式如:07-02-03,[回车]退出:
if defined sdate goto Main
|
|
2007-8-4 23:20 |
|
|
zjl5
初级用户
积分 82
发帖 15
注册 2007-5-26
状态 离线
|
『第
41 楼』:
奇怪%errorlevel%怎么会是9167,兄台解释一下,谢谢!!
因为没有编辑贴子的权限,所以又得另发一张了.
:: 月历查询工具 中国DOS联盟专用版 转载请注明版权
:: 原创:zjl5 更新:namejm, qzwqzw 2007-06-03
:: 算法:基姆拉尔森计算公式
:: W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
:: 把一月和二月看成是上一年的十三月和十四月
:: 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
:: 输入的日期格式为:年-月-日(-可以替换为:、/,可以混用)
:: 在日历里面,★=当天
:: 支持多种格式的日期输入:
:: ① 若只输入一个数,则认为是查询当年月份,自动截取后两位数字查询,★标在1日上;
:: ② 若输入两个数,则认为是查询年和月,★标在1日上;
:: ③ 输全的话,★标在指定日期上
:: 关于年份的转换:
:: ① 若年份上输入的数字少于三位,则作如下转换:
:: 50~99判定为19xx
:: 0~49判定为20xx
:: ② 若输入的年份数字超过两位,则截取后四位字符(不足部分在高位补0),
:: 按 ① 的规则计算该年份的日期;
@echo off
color 3F
mode con cols=40 lines=20
setlocal enabledelayedexpansion
set str=日一二三四五六
set sdate=%date%
:Main
cls&echo.
:: 日期提取、格式化与校验
for /f "tokens=1,2,3 delims=-/: " %%i in ("%sdate%") do (
(set sy=%%i) && (set sm=%%j) && (set sd=%%k)
)
if not defined sd set sd=1
if not defined sm set sm=%sy%& set sy=%date:~0,4%
(set sy=0000%sy%) && (set sm=00%sm%) && (set sd=00%sd%)
(set sy=%sy:~-4%) && (set sm=%sm:~-2%) && (set sd=%sd:~-2%)
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2>nul
if errorlevel 9167 goto Error
if %y% lss 100 (
if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)
set sy=!y!
)
if %m% lss 13 if %d% lss 32 goto Calc
:Error
echo.错误的日期.
pause>nul
cd.
set sdate=%date%
goto Main
:Calc
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊
set tg=庚辛壬癸甲乙丙丁戊己
set dz=申酉戌亥子丑寅卯辰巳午未
set /a sxnum=%sy% %% 12
set /a tgnum=%sy:~-1%
title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1!
:: 计算每个月的天数
set days=31
for %%i in (4 6 9 11) do if %m% equ %%i set days=30
:: 计算2月份的偏差
set /a leap="^!(y%%4) & ^!(^!(y%%100)) | ^!(y%%400)"
if %m% equ 2 set /a days=28+%leap%
if %m% leq 2 (set /a y-=1& set /a m+=12)
:: 计算指定日期的星期数
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7
echo. %sy%年%sm%月 查询日:%sy%-%sm%-%sd%,星期!str:~%w%,1!
echo.
:: 生成月历
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1
echo. 日 一 二 三 四 五 六
echo. ━━━━━━━━━━━━━━━━━━━
set /p= <nul
for /l %%i in (0,1,37) do (
set "temp= "
if %%i GTR %wb% if %%i LSS %we% (
set temp= !day!
set temp=!temp:~-2!
if !d! EQU !day! set temp=★
set /a day+=1
)
set /p= !temp!<nul
set /a "wm=(%%i+1)%%7"
if !wm! equ 0 echo.&echo.&set /p= <nul
)
echo.
echo ━━━━━━━━━━━━━━━━━━━
echo. 输入日期可查询当日星期并显示当月月历
echo.
set sdate=
set /p sdate= 格式如:07-02-03,[回车]退出:
if defined sdate goto Main
|
|
2007-8-5 01:21 |
|
|
qzwqzw
银牌会员
天的白色影子
积分 2342
发帖 635
注册 2004-3-6
状态 离线
|
『第
42 楼』:
9167是set /a因为无效数字(比如09)错误产生的errorlevel
需要注意的是set /p如果未获取到任何输入也会产生1的errorlevel
而且即使set /a和set /p再正常运行也不会复位早前的errorlevel
也就是说,在命令行或者.bat脚本中
set命令只有在运行出错时才会置errorlevel为非0值
在正确运行时是不会置0值的
而在.cmd脚本中
set在正确运行时是会置errorlevel为0值的
|
|
2007-8-5 18:47 |
|
|
sunny04551
贫困用户
积分 -4
发帖 5
注册 2007-8-20
状态 离线
|
|
2007-8-20 15:30 |
|
|
meicnk
初级用户
积分 22
发帖 11
注册 2006-9-1
状态 离线
|
|
2007-8-27 11:16 |
|
|
hmilywenjia
新手上路
积分 8
发帖 5
注册 2008-2-2
状态 离线
|
『第
45 楼』:
今天上来看到namejm的消息很是高兴啊,一直关注你的消息,你没事就好
|
|
2008-5-26 14:14 |
|