中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 怎么控制日期的输入 上一主题 | 下一主题
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『楼 主』:  怎么控制日期的输入


:year_set_daye
set/p year_set_daye=输入4位年份   [回车]退出:
if "%year_set_daye%" =="" goto :eof
echo.%year_set_daye%|findstr "\<[1-9][0-9][0-9][0-9]\>" >nul&&goto month_set_daye||echo 输入4位年份(只能是0-9,首位不能为0)&goto year_set_daye
:month_set_daye
set/p month_set_daye=输入月份      [回车]退出:
if "%month_set_daye%" == "" echo 不能为空&goto month_set_daye
echo.%month_set_daye%|findstr "\<[0-1][0-9]\>" >nul&&(goto month_next)||(echo 输入2位月份&goto month_set_daye)
:month_next
if %month_set_daye% gtr 12 echo.输入月份大于了12&goto month_set_daye
if "%month_set_daye%" lss "01" echo.错误输入&goto month_set_daye
echo %month_set_daye%|findstr "^[0-9]*$">nul&&goto day_set_daye||echo 只能是0-9&goto month_set_daye
:day_set_daye
set/p p3=输入日期      [回车]退出:
if "%p3%" == "" echo 不能为空 &goto day_set_daye
echo.%p3%|findstr "\<[0-3][0-9]\>" >nul&&(goto day_next)||(echo 输入2位日期&goto day_set_daye)
:day_next
if %p3% gtr 31 echo.错误输入&goto day_set_daye
if %p3% lss 1 echo.错误输入&goto day_set_daye
echo %p3%|findstr "^[0-9]*$">nul&&goto p4||echo 只能是0-9&goto day_set_daye
:p4
....
...
这上面的代码有问题,应该怎么完善

2009-2-14 16:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

上面的代码有什么问题?



2009-2-14 16:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『第 3 楼』:  

输入08月和09月会出错

If帮助有:

如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。

没看明白


月份输入08或09

if %month_set_daye% lss 1 echo.输入月份小于了1

判断08或09竟然是小于1

[ Last edited by provem on 2009-2-14 at 17:06 ]

2009-2-14 17:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『第 4 楼』:  

明白了输入 08 或09时 已经认为是8进制的数值了,所以当输入08或09时就会出错

那这个问题应该怎么避免呢

2009-2-14 17:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  Re 3楼

怎样去除数字前面的零?
http://www.cn-dos.net/forum/viewthread.php?tid=39883



2009-2-14 17:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 6 楼』:  


@echo off&setlocal enabledelayedexpansion
set msn= 31 28 31 30 31 30 31 31 30 31 30 31
set ms0= 31 29 31 30 31 30 31 31 30 31 30 31
:lp
set /p gd=输入开始日期(yyyy-mm-dd):
set gd=%gd:~0,10%
if not "%gd:~4,1%%gd:~7,1%"=="--" goto :err
set/a d=1%gd:~8,2%-100,m=1%gd:~5,2%-100,y=1%gd:~0,4%-10000 || goto :err
if %y% lss 1800 goto :err
if %y% gtr 2050 goto :err
if %m% gtr 12 goto :err
if %m% leq 0 goto :err
if %d% leq 0 goto :err
set/a vy=y%%4,vm=^(m+11^)%%12*3
if %vy%==0 (set ms=%ms0%) else (set ms=%msn%)
set am=!ms:~%vm%,3!
if %d% gtr %am% goto :err
::前面校验日期的有效性,并把年,月,日分别存到变量y,m,d

set ch=7

::计算七天后日期
set/a d+=ch
if %d% gtr %am% (set/a m+=1
        if !m! gtr 12 (set/a y+=1,m=1)
        set/a d-=am
)

::调整日期格式
if %m% lss 10 (set m=0%m%)
if %d% lss 10 (set d=0%d%)
set date-x=%y%-%m%-%d%
echo 输入的日期是:%gd%
echo 该日期%ch%天后是:%date-x%
echo.
echo.

::修改文件数据
(echo =============================================
for /f "tokens=1* delims==" %%a in (a.property) do (
        if "%%b"=="" (echo.%%a) else (
                set "str=%%a"
                if "!str:~0,9!"=="BeginDate" (echo.%%a=%gd%)
                if "!str:~0,7!"=="EndDate" (echo.%%a=%date-x%)
                if "!str:~0,6!"=="Minute" (echo.%%a=%%b)
        )
)
echo =============================================)>a.temp
type a.temp>a.property
type a.temp&del a.temp
pause
goto :eof

:err
echo 输入格式有错!请重新输入.&goto :lp
[ Last edited by netbenton on 2009-4-9 at 11:33 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-2-14 18:24
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『第 7 楼』:  

我希望的还是要保留那个0,不知道还有其它办法没

2009-2-14 19:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  Re 7楼


if 1%month_set_daye% lss 101 echo.错误输入&goto month_set_daye
这样行么?



2009-2-14 21:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
provem
初级用户





积分 92
发帖 82
注册 2007-11-13
状态 离线
『第 9 楼』:  

还是不行,不过还是谢谢版主

2009-2-20 14:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 10 楼』:  Re 9楼


@echo off
set /p month_set_daye=请输入月份:
if 1%month_set_daye% lss 101 (
  echo.错误输入
  goto :month_set_daye
)
echo 行。
goto :eof
:month_set_daye
echo 不行?去电线杆上找老中医!
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Test>test.bat
请输入月份:08
行。

C:\Test>test.bat
请输入月份:09
行。

C:\Test>test.bat
请输入月份:0
错误输入
不行?去电线杆上找老中医!
C:\Test>
[/olor]



2009-2-20 15:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: