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

[文本处理] 【已解决】求助批处理辨别用户输入的内容是否符合某个规范

本帖最后由 蚯蚓传奇 于 2024-8-21 12:04 编辑

我想请教一下怎么辨别用户输入一段日期是否符合规范
让用户输入一个日期,然后程序检查文本是否是按照**(月)/**(日)的格式写的
如果可以的话,我还想让这个程序拥有检查日期是否有错误的功能,比如1月不能有31号
最好只用批处理或者powershell,谢谢
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 74# WHY


   
谢谢大佬指点!
bat小白,请多指教!谢谢!

TOP

本帖最后由 WHY 于 2024-8-28 08:53 编辑

回复 68# 77七


    用 & 连接的语句,本身就是语句块;放到 for 循环里,语句块里面再套语句块,预处理时 cmd 认为是等价的,预处理花费的时间是一样的,执行时间相差无几。
就是说,
  1. for %%i in (1) do (
  2.     set "a=1"
  3.     set "b=2"
  4.     set "c=3"
  5. )
复制代码
  1. for %%i in (1) do set "a=1" & set "b=2" & set "c=3"
复制代码
以及
  1. for %%i in (1) do (
  2.     set "a=1" & set "b=2" & set "c=3"
  3. )
复制代码
等价

参考:http://www.bathome.net/thread-4482-1-1.html
PS: 想要提速,多在算法和思路上做文章,尽量少用call和goto;尽量少在for循环体内部使用外部命令。。。
用 & 、&&、||连接虽然可以带来效率提升,但提升空间非常有限,反倒是可读性、可维护性大打折扣,能不用就坚决不用吧。

TOP

回复 72# 77七
谢谢测试,对此种效率有了更进一步的了解。

TOP

回复 70# qixiaobin0715


   goto测试,100次,&连接耗时0.23秒,分开写 0.40秒
bat小白,请多指教!谢谢!

TOP

回复 69# aloha20200628

简单测试了下,果然如大佬所言,call 了100次,&连接的耗时0.22秒,分开写的耗时0.36秒。
bat小白,请多指教!谢谢!

TOP

回复 68# 77七
那就用goto循环语句测试一下试试。

TOP

本帖最后由 aloha20200628 于 2024-8-26 18:30 编辑

回复 68# 77七

已说过也许批处对复合语块典型如for...句式是先全块读尽处理的,此乃for句式效率较高的原因,其内是不能如其外简单分行执行的...
与解译型脚本逐行解译执行原理一致的纯净测试应该如是:
   set a=...&set b=...&...

  set a=...
  set b=...
  ...
比对测试
但对批处的小微代码测试而言,其差别也许无感...

TOP

回复 67# aloha20200628


   
大佬,我使用set /a 测试了一下
  1. @echo off
  2. for /l %%l in (1,1,5) do (
  3. timeout 3 >nul
  4. setlocal
  5. echo 紧凑型
  6. call echo %%time%%
  7. call :1
  8. call echo %%time%%
  9. endlocal
  10. echo=
  11. timeout 3 >nul
  12. setlocal
  13. echo 分散型
  14. call echo %%time%%
  15. call :2
  16. call echo %%time%%
  17. endlocal
  18. echo=
  19. )
  20. pause
  21. exit
  22. :1
  23. for /l %%l in (1,1,10000) do (
  24. set /a a=1&set /a b=2&set /a c=3&set /a d=4&set /a e=5&set /a f=6&set /a g=7
  25. )
  26. exit /b
  27. :2
  28. for /l %%l in (1,1,10000) do (
  29. set /a a=1
  30. set /a b=2
  31. set /a c=3
  32. set /a d=4
  33. set /a e=5
  34. set /a f=6
  35. set /a g=7
  36. )
  37. exit /b
复制代码


  1. 紧凑型
  2. 17:15:34.13
  3. 17:15:38.26
  4. 分散型
  5. 17:15:41.12
  6. 17:15:45.01
  7. 紧凑型
  8. 17:15:48.19
  9. 17:15:52.18
  10. 分散型
  11. 17:15:55.16
  12. 17:15:59.17
  13. 紧凑型
  14. 17:16:02.14
  15. 17:16:06.23
  16. 分散型
  17. 17:16:09.20
  18. 17:16:13.18
  19. 紧凑型
  20. 17:16:16.18
  21. 17:16:20.20
  22. 分散型
  23. 17:16:23.16
  24. 17:16:27.09
  25. 紧凑型
  26. 17:16:30.16
  27. 17:16:34.17
  28. 分散型
  29. 17:16:37.16
  30. 17:16:41.06
  31. 请按任意键继续. . .
复制代码


用&连接,效率反而要低些
bat小白,请多指教!谢谢!

TOP


批处是一种典型的解译型脚本,其执行原理基本上就是逐行处理(连注释行也不放过),也许对复合语块要先全块读尽再逐行处理,因此代码能并为一行会比分行的解译执行效率高,此被老帖早有述及,但这同时也会降低代码可读性... 总而言之,这是一个二者权衡尺度的问题,又是一个造码者编程风格或言个人偏好的问题...

TOP

回复 65# 77七
还是相信测试吧。

TOP

回复 64# qixiaobin0715

大佬,我测试了下
   1.txt 为1-10000,共1万个数字用for /f 判断

  1. 16:25:16.03
  2. 16:25:16.15
  3. 16:25:16.20
复制代码



定义用了0.12秒,判断是否定义仅用了0.05秒
bat小白,请多指教!谢谢!

TOP

回复 63# 77七
不好说,毕竟每次执行defined时都要从大量的预定义的变量中查找符合条件的变量。

TOP

回复 62# qixiaobin0715


   感谢大佬认可!我觉得代码发出来交流,如果写的紧凑到一起,至少我是不想读的。
用echo %time%简单测试了一轮,全部写明日期。
52楼(去除了获取年份及判断平闰年代码)耗时0.01秒
60楼 耗时0.01秒
62楼 耗时0.13秒
在本题实际应用环境下,感觉没必要考虑效率,毕竟打开批处理,就已经 “预处理” 完成了。

如果判断大量数据,猜测全定义效率最高,毕竟只要一个 if defined:lol
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 58# 77七
实际上不喜欢为了让别人看起来自己写的代码行数较少,而强行将多行变成一行,比较喜欢你的风格,虽然从行数上看代码较长,但是一目了然,清清楚楚,最近我好像也有点给带偏了。
给自己代码较长强行找点理由。既然对于这个问题来说,效率不是那么重要,就来个数据全定义代码,这样子判断起来就简单多了,要是有空的话,帮忙测试一下耗时情况:
  1. @echo off
  2. for /l %%i in (1,1,12) do (
  3.     for /l %%j in (1,1,31) do (
  4.         if %%i lss 10 (
  5.             if %%j lss 10 (
  6.                 set _"%%i/%%j"=0
  7.                 set _"0%%i/0%%j"=0
  8.             ) else (
  9.                 set _"%%i/%%j"=0
  10.                 set _"0%%i/%%j"=0
  11.             )
  12.         ) else (
  13.             if %%j lss 10 (
  14.                 set _"%%i/%%j"=0
  15.                 set _"%%i/0%%j"=0
  16.             ) else (
  17.                 set _"%%i/%%j"=0
  18.             )
  19.         )
  20.     )
  21. )
  22. for %%i in (2 4 6 9) do (
  23.     set _"%%i/31"=
  24.     set _"0%%i/31"=
  25. )
  26. set _"11/31"=
  27. set _"2/30"=
  28. set _"02/30"=
  29. setlocal enabledelayedexpansion
  30. :o
  31. set/p "md=Please Input the Date (MM/DD):"
  32. if defined _"!md!" (
  33.     echo,Input Correct
  34. ) else (
  35.     echo,Input Error
  36.     goto :o
  37. )
  38. pause
复制代码

TOP

返回列表