[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 qixiaobin0715 于 2024-8-21 09:13 编辑

回复 6# ppll2030
看到你第2个代码,使用findstr一般表达式,头都晕了,感觉太繁琐了。高手!!
自己设想是不是用判断语句思路更清晰些,也很简单。谁知眼高手低,写起来也是很费劲,也一样繁琐。还是发出来让需要的人作为参考,即使不需要 ,也可作为判断语句学习时的参考:
  1. @echo off
  2. :o
  3. set/p "_md=Please Input the Date (MM/DD):"
  4. for /f "tokens=1* delims=/" %%i in ("%_md%") do (
  5.     if not "%%j"=="" (
  6.         if "%%i" geq "01" if "%%i" leq "12" if "%%j" geq "01" if "%%j" leq "31" set n=1
  7.         if defined n (
  8.             if "%%i" equ "02" (
  9.                 if "%%j" geq "30"    set n=
  10.             ) else (
  11.                 for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
  12.             )
  13.         )
  14.     )
  15. )
  16. if not defined n echo,Input Error&goto :o
  17. echo,Input Correct
  18. pause
复制代码
总是感觉哪里不对。1/1也是合法的。

TOP

本帖最后由 ppll2030 于 2024-8-21 09:20 编辑

回复 16# qixiaobin0715


    哈哈。不是高手,因为我看你的这段也是头大
我对if嵌套很不喜,套多了就脑子不够用,逻辑跟不上。;P
我是能不用就不用。

至于这个findstr,其实很简单的啊,就是正向匹配而已。用表达式把符合的情况都列出来即可。
这不,半夜里费脑子,还是被大佬揪出瑕疵了。

TOP

回复 16# qixiaobin0715


    大概看到问题了。你这个if只是对数值的大小比较啊,所以 1 geq 01 是成立的。01在数值比较里就是1啊

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 10:13 编辑

回复 18# ppll2030
加了一段代码,这样应当可以了,保留上面代码,可以对比参考:
  1. @echo off
  2. :o
  3. set/p "_md=Please Input the Date (MM/DD):"
  4. for /f "tokens=1* delims=/" %%i in ("%_md%") do (
  5.     if not "%%j"=="" (
  6.         if "%%i" geq "01" if "%%i" leq "12" if "%%j" geq "01" if "%%j" leq "31" set n=1
  7.         for /l %%k in (1,1,3) do (
  8.             if "%%k" equ "%%i" set n=
  9.             if "%%k" equ "%%j" set n=
  10.         )
  11.         if defined n (
  12.             if "%%i" equ "02" (
  13.                 if "%%j" geq "30"    set n=
  14.             ) else (
  15.                 for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
  16.             )
  17.         )
  18.     )
  19. )
  20. if not defined n echo,Input Error&goto :o
  21. echo,Input Correct
  22. pause
复制代码

TOP

回复 18# ppll2030
非数值比较,加了引号就是字符串比较。

TOP

回复 18# ppll2030
  1. if 1 equ 01 echo,good
  2. if "1" equ "01" echo,good
  3. if "3" gtr "111" echo,good
复制代码

TOP

回复 21# qixiaobin0715


    好吧。理解错了。字符串比较大小基本没用过。除了那个两字符串是否相符的“==” 回头补习一下。

TOP

回复 19# qixiaobin0715

大佬,我试了一下,非数字也正确
  
  1. Please Input the Date (MM/DD):11/1qqqq
  2. Input Correct
复制代码
bat小白,请多指教!谢谢!

TOP

回复 19# qixiaobin0715


    估计还要修改一下下

Please Input the Date (MM/DD):12-12
Input Error
Please Input the Date (MM/DD):12/12
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):0/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):10/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):6/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):4/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):/31
Input Correct
请按任意键继续. . .
Please Input the Date (MM/DD):5/31
Input Correct
请按任意键继续. . .

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 12:21 编辑

回复 24# ppll2030
你的测试方法不对。是否是在代码最后加上一个goto循环?这样会有变量残值存在,有些结果会不一样。不信你可以试试。但确实存在非数字也能通过的问题。
你想用这种方法测试的话,在本次循环后,代码再次运行前,必须消减掉上一次运行时的变量残值,在你后加的goto循环前一行,也即是倒数第2行加上这段代码:
  1. set _md=
  2. set n=
复制代码

TOP

回复 23# 77七
看样子用判断语句也是挺繁琐的,set /p下加一行:
  1. for /f "tokens=1* delims=0123456789" %%i in ("%_md%") do if not "%%i%%j"=="/" goto :p
复制代码
第19、20行之间加上循环标签:p
不知还有何bug

TOP

回复 19# qixiaobin0715

用纯P一贯到底,还是应该先解决 ‘卡位和定界’,即检查输入长度是否=5,检查第三位是否为 /,检查定界符之外是否均为数字,其后再完成月值与日值的关联处理,否则会使处理逻辑复杂化...

另说》纯P内部数据处理也许只有字符串一种数据类型,因此以下三式返回值相同
   if 09 lss 1 (@echo,1) else @echo,0
   if "09" lss "1" (@echo,1) else @echo,0
   if 0q lss 1 (@echo,1) else @echo,0
1

评分人数

TOP

回复 27# aloha20200628
确实还有bug:0101/11
思路有问题,需要重写。

TOP

重写代码,部分参考或者说借鉴27楼的思路,先按正确的格式定义月份日期,再进行判断:
  1. @echo off
  2. for /l %%i in (1,1,31) do (
  3.     if %%i lss 10 (
  4.         set @0%%i=1
  5.         set #0%%i=1
  6.     ) else (
  7.         set @%%i=1
  8.         if %%i leq 12 set #%%i=1
  9.     )
  10. )
  11. :o
  12. set/p "md=Please Input the Date (MM/DD):"
  13. if not "%md://=%"=="%md%" goto :p
  14. for /f "tokens=1* delims=/" %%i in ("%md%") do (
  15.     if defined #%%i if defined @%%j set n=1
  16.     if defined n (
  17.         if "%%i" equ "02" (
  18.             if "%%j" geq "30"    set n=
  19.         ) else (
  20.             for %%k in (04 06 09 11) do if "%%i" equ "%%k" if "%%j" equ "31" set n=
  21.         )
  22.     )
  23. )
  24. :p
  25. if not defined n echo,Input Error&goto :o
  26. echo,Input Correct
  27. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-8-21 16:22 编辑

代码第13行是为了过滤类似这样的输入合法通过:01//01
如果觉得无所谓,去掉也行。
越搞越复杂。
就当练手吧。

TOP

返回列表