返回列表 发帖

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

本帖最后由 蚯蚓传奇 于 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 认为是等价的,预处理花费的时间是一样的,执行时间相差无几。
就是说,
for %%i in (1) do (
    set "a=1"
    set "b=2"
    set "c=3"
)COPY
for %%i in (1) do set "a=1" & set "b=2" & set "c=3"COPY
以及
for %%i in (1) do (
    set "a=1" & set "b=2" & set "c=3"
)COPY
等价

参考: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 测试了一下
@echo off
for /l %%l in (1,1,5) do (
timeout 3 >nul
setlocal
echo 紧凑型
call echo %%time%%
call :1
call echo %%time%%
endlocal
echo=
timeout 3 >nul
setlocal
echo 分散型
call echo %%time%%
call :2
call echo %%time%%
endlocal
echo=
)
pause
exit
:1
for /l %%l in (1,1,10000) do (
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
)
exit /b
:2
for /l %%l in (1,1,10000) do (
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
)
exit /bCOPY


紧凑型
17:15:34.13
17:15:38.26
分散型
17:15:41.12
17:15:45.01
紧凑型
17:15:48.19
17:15:52.18
分散型
17:15:55.16
17:15:59.17
紧凑型
17:16:02.14
17:16:06.23
分散型
17:16:09.20
17:16:13.18
紧凑型
17:16:16.18
17:16:20.20
分散型
17:16:23.16
17:16:27.09
紧凑型
17:16:30.16
17:16:34.17
分散型
17:16:37.16
17:16:41.06
请按任意键继续. . .COPY


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

TOP


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

TOP

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

TOP

回复 64# qixiaobin0715

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

16:25:16.03
16:25:16.15
16:25:16.20COPY



定义用了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七
实际上不喜欢为了让别人看起来自己写的代码行数较少,而强行将多行变成一行,比较喜欢你的风格,虽然从行数上看代码较长,但是一目了然,清清楚楚,最近我好像也有点给带偏了。
给自己代码较长强行找点理由。既然对于这个问题来说,效率不是那么重要,就来个数据全定义代码,这样子判断起来就简单多了,要是有空的话,帮忙测试一下耗时情况:
@echo off
for /l %%i in (1,1,12) do (
    for /l %%j in (1,1,31) do (
        if %%i lss 10 (
            if %%j lss 10 (
                set _"%%i/%%j"=0
                set _"0%%i/0%%j"=0
            ) else (
                set _"%%i/%%j"=0
                set _"0%%i/%%j"=0
            )
        ) else (
            if %%j lss 10 (
                set _"%%i/%%j"=0
                set _"%%i/0%%j"=0
            ) else (
                set _"%%i/%%j"=0
            )
        )
    )
)
for %%i in (2 4 6 9) do (
    set _"%%i/31"=
    set _"0%%i/31"=
)
set _"11/31"=
set _"2/30"=
set _"02/30"=
setlocal enabledelayedexpansion
:o
set/p "md=Please Input the Date (MM/DD):"
if defined _"!md!" (
    echo,Input Correct
) else (
    echo,Input Error
    goto :o
)
pauseCOPY

TOP

返回列表