[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
才5个字符,用批处理的话逐字符判断更可靠一些
  1. @echo off
  2. set/p "data=Please enter a date (MM/DD):"
  3. set "error=echo,Invalid date&pause&goto :eof"
  4. setlocal enabledelayedexpansion
  5. for /l %%i in (5,-1,0) do (
  6.     set "data%%i=!data:~%%i,1!"
  7.     if not "!data%%i!"=="" (
  8.         if %%i equ 5 (
  9.             %error%
  10.         ) else if %%i equ 2 (
  11.             if "!data%%i!" neq "/" %error%
  12.         ) else if "!data%%i!" lss "0" (
  13.             %error%
  14.         ) else if "!data%%i!" gtr "9" %error%
  15.     ) else (
  16.         if %%i equ 4 %error%
  17.     )
  18. )
  19. if %data0% equ 0 set "data0="
  20. if %data3% equ 0 set "data3="
  21. set mm=%data0%%data1%
  22. set dd=%data3%%data4%
  23. if %mm% gtr 12 %error%
  24. if %dd% gtr 31 %error%
  25. for /f "tokens=2" %%i in ('wmic os get codeset^,localdatetime') do (
  26.     set yyyy=%%i
  27.     set "yyyy=!yyyy:~0,4!"
  28.     )
  29. endlocal&set /a mm=%mm%,dd=%dd%,yyyy=%yyyy%
  30. set /a "gtm=!(mm-4)|!(mm-6)|!(mm-9)|!(mm-11)","leap=!(yyyy%%4)&!!(yyyy%%100)|!(yyyy%%400)","dlim=!(mm-2)*(28+leap)+gtm*30+(!!(mm-2)&!gtm)*31"
  31. if %dd% gtr %dlim% (%error%) else (echo,Valid date)
  32. pause&exit /b
复制代码
1

评分人数

    • 77七: 学习了,set/a很精彩!技术 + 1

TOP

回复 27# aloha20200628


    因为09不是有效的八进制数字,试试0x9
1

评分人数

    • qixiaobin0715: 像我这样的大多数人都会忽略这个问题!技术 + 1

TOP

回复 37# 77七


    感谢测试,限制上限的时候忘记限制下限了,再补上 set /a "1/(!!mm&!!dd)" 2>nul ||(%error%) 就没有问题了。

TOP

本帖最后由 buyiyang 于 2024-8-24 17:47 编辑

回复 45# aloha20200628
1//1a
1/--1
1/+1
一个是分隔符被忽略的问题,一个是if比较时不能转换成有效数字的会按字符比较,数字比较时没有排除正负号。
忘了还有变量延迟下的两个特殊字符,
1/!1
1/!^1

TOP

回复 45# aloha20200628

endlcoal 后第二行设定的变量也无了,
第14行的if %m% lss 1 if %m% gtr 12 逻辑有误,其实这一行不要也行,第17行if %d% gtr 0 if %d% leq !%_m%! 兼有限制月份的作用。

TOP

本帖最后由 buyiyang 于 2024-8-25 12:47 编辑

综合一下35、45、48、55楼,有一些不错的写法
最终主体只需要9、11、12行三句判断就够了。
第9行限制输入字符数和分隔符位置,
第11行限制月份和日期均为数字,
第12行限制月份和日期范围。
  1. @echo off
  2. for /f "tokens=2" %%i in ('wmic os get codeset^,localdatetime') do set yyyy=%%i&call set yyyy=%%yyyy:~0,4%%
  3. set /a _01=_03=_05=_07=_08=_10=_12=31,_04=_06=_09=_11=30,"_02=28+(!(yyyy%%4)&!!(yyyy%%100)|!(yyyy%%400))"
  4. set "error=echo,Invalid date&endlocal&goto :loop"
  5. :loop
  6. set /p "md=Please enter a date (MM/DD):"
  7. setlocal enabledelayedexpansion
  8. if "!md:~2,-2!" neq "/" (%error%)
  9. set "mm=!md:~0,2!"&set "dd=!md:~3,2!"
  10. for /f "delims=0123456789" %%i in ("!mm!!dd!") do (%error%)
  11. if "!dd!" gtr "00" if "!dd!" leq "!_%mm%!" (echo,Valid date&endlocal&goto :loop)
  12. %error%
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 buyiyang 于 2024-8-25 12:32 编辑

回复 55# qixiaobin0715


    我尝试写了一个
  1. @echo off
  2. for /f "tokens=2" %%i in ('wmic os get codeset^,localdatetime') do set yyyy=%%i&call set yyyy=%%yyyy:~0,4%%
  3. set /a _01=_03=_05=_07=_08=_10=_12=31,_04=_06=_09=_11=30,"_02=28+(!(yyyy%%4)&!!(yyyy%%100)|!(yyyy%%400))"
  4. set "error=echo,Invalid date&endlocal&goto :loop"
  5. :loop
  6. set /p "md=Please enter a date (M/D):"
  7. setlocal enabledelayedexpansion
  8. set "a=!md:*/=!"&set "dd=!a:/=!"
  9. if "!a!" neq "!dd!" (%error%)
  10. for /f "delims=0123456789" %%i in ("!md:/=!") do (%error%)
  11. for /f "tokens=1* delims=/" %%i in ("!md!") do (endlocal&set "mm=%%i"&set "dd=%%j")
  12. setlocal enabledelayedexpansion
  13. if "!dd!"=="" (%error%)
  14. if "!mm:~2,1!" neq "" (%error%)
  15. if "!dd:~2,1!" neq "" (%error%)
  16. if "!mm:~0,1!" equ "0" if "!dd:~1,1!"=="" (%error%)
  17. if "!dd:~0,1!" equ "0" if "!mm:~1,1!"=="" (%error%)
  18. set "mm=0!mm!"&set "mm=!mm:~-2!"
  19. set "dd=0!dd!"&set "dd=!dd:~-2!"
  20. if "!dd!" gtr "00" if "!dd!" leq "!_%mm%!" (echo,Valid date&endlocal&goto :loop)
  21. %error%
复制代码
1

评分人数

TOP

返回列表