标题: 怎么控制日期的输入
[打印本页]
作者: provem
时间: 2009-2-14 16:33
标题: 怎么控制日期的输入
:year_set_daye
set/p year_set_daye=输入4位年份 退出:
if "%year_set_daye%" =="" goto :eof
echo.%year_set_daye%|findstr "\<\>" >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 "\<\>" >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 "^*$">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 "\<\>" >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 "^*$">nul&&goto p4||echo 只能是0-9&goto day_set_daye
:p4
....
...
这上面的代码有问题,应该怎么完善
作者: HAT
时间: 2009-2-14 16:58
上面的代码有什么问题?
作者: provem
时间: 2009-2-14 17:04
输入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 ]
作者: provem
时间: 2009-2-14 17:12
明白了输入 08 或09时 已经认为是8进制的数值了,所以当输入08或09时就会出错
那这个问题应该怎么避免呢
作者: HAT
时间: 2009-2-14 17:14
标题: Re 3楼
作者: netbenton
时间: 2009-2-14 18:24
@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 ]
作者: provem
时间: 2009-2-14 19:11
我希望的还是要保留那个0,不知道还有其它办法没
作者: HAT
时间: 2009-2-14 21:42
标题: Re 7楼
if 1%month_set_daye% lss 101 echo.错误输入&goto month_set_daye
这样行么?
作者: provem
时间: 2009-2-20 14:48
还是不行,不过还是谢谢版主
作者: HAT
时间: 2009-2-20 15:22
标题: 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
(C) Copyright 1985-2001 Microsoft Corp.
C:\Test>test.bat
请输入月份:08
行。
C:\Test>test.bat
请输入月份:09
行。
C:\Test>test.bat
请输入月份:0
错误输入
不行?去电线杆上找老中医!
C:\Test>