返回列表 发帖
@echo off
set /p str=input:
call :1
if defined k (
echo 合法
) else (
echo 非法
)
pause
exit
:1
setlocal
for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do set year=%%a&call set year=%%year:~0,4%%
set /a _1=_3=_5=_7=_8=_10=_12=31,_4=_6=_9=_11=30
rem "http://www.bathome.net/redirect.php?goto=findpost&ptid=3769&pid=24349"
set/a num=!(year%%4) ^& !(!(year%%100)) ^| !(year%%400),1/num 2>nul && set _2=29|| set _2=28
setlocal enabledelayedexpansion
for /l %%l in (1,1,12) do for /l %%m in (1,1,!_%%l!) do (set l=0%%l&set m=0%%m&set #!l:~-2!/!m:~-2!=1)
if defined #!str! (endlocal &endlocal &set k=1) else (endlocal &endlocal)
exit /bCOPY
1

评分人数

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

TOP

本帖最后由 77七 于 2024-8-20 11:00 编辑

echo 一个未知的字符串|find (findstr)其实是一个很危险的操作,因为特殊字符影响会导致各种错误
@echo off
set "str=1&2"
echo %str%|find "1" 1>nul && echo #1 闪退
echo %str%|find "2" 1>nul && echo #2 闪退
echo "%str%"|find "1" 1>nul && echo #3 判断成功
echo "%str%"|find "2" 1>nul && echo #4 判断成功
setlocal enabledelayedexpansion
echo !str!|find "1" 1>nul && echo #5 报错,判断成功
echo !str!|find "2" 1>nul && echo #6 报错,判断失败
set "str=1&2""
echo "%str%"|find "1" 1>nul && echo #7 整行的特殊符号都被双引号转义
pauseCOPY
1

评分人数

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

TOP

回复 12# aloha20200628


  set /p="..."<nul 对比echo "..."优点不多,缺点倒是多一些
bat小白,请多指教!谢谢!

TOP

回复 19# qixiaobin0715

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

TOP

回复 30# qixiaobin0715


   月份日期分开定义,再拆开判断,不如直接全定义 #01/01 ...#12/31,然后结束了...
bat小白,请多指教!谢谢!

TOP

回复 35# buyiyang


   
大佬,00/00的情况,没有判断,防不胜防
bat小白,请多指教!谢谢!

TOP

用临时文件,仅判断两位数+/+两位数,应该可以对付所有特殊字符了吧
@echo off
set /p str=input:
setlocal enabledelayedexpansion
>1.txt echo=#!str!
endlocal
findstr /rxc:"#[0-9][0-9]/[0-9][0-9]" 1.txt
if not errorlevel 1 (
echo ok
)
pauseCOPY
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2024-8-24 18:29 编辑
@echo off
for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do set year=%%a&call set year=%%year:~0,4%%
set /a _1=_3=_5=_7=_8=_10=_12=31,_4=_6=_9=_11=30
set/a num=!(year%%4) ^& !(!(year%%100)) ^| !(year%%400),1/num 2>nul && set _2=29|| set _2=28
:loop
setlocal
set /p n=input:
set "n1=%n:~0,2%"
set "n2=%n:~2,1%"
set "n3=%n:~3,2%"
set "n4=%n:~5%"
setlocal enabledelayedexpansion
set a=非法
if "!n2!" equ "/" (
if "!n4!" equ "" (
for /l %%l in (1,1,12) do (
set str=0%%l
if "!n1!" equ "!str:~-2!" (
for /l %%m in (1,1,!_%%l!) do (
set str=0%%m
if "!n3!" equ "!str:~-2!" (
set a=合法
)
)
)
)
)
)
endlocal & endlocal &echo %a%
goto :loopCOPY

判断 相应位置的字符串与 分隔符号 "/" 及限定范围的日期、月份是否有相等情况。初步测试,可以应付各种特殊字符。
bat小白,请多指教!谢谢!

TOP

简化一下
@echo off
for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do set year=%%a&call set year=%%year:~0,4%%
set /a _1=_3=_5=_7=_8=_10=_12=31,_4=_6=_9=_11=30
set/a num=!(year%%4) ^& !(!(year%%100)) ^| !(year%%400),1/num 2>nul && set _2=29|| set _2=28
:loop
setlocal
set /p n=input:
setlocal enabledelayedexpansion
set a=非法
if "!n:~2,1!!n:~5,1!" equ "/" (
for /l %%l in (1,1,12) do (
set str=0%%l
if "!n:~0,2!" equ "!str:~-2!" (
for /l %%m in (1,1,!_%%l!) do (
set str=0%%m
if "!n:~3,2!" equ "!str:~-2!" (
set a=合法
)
)
)
)
)
endlocal & endlocal &echo %a%
goto :loopCOPY
bat小白,请多指教!谢谢!

TOP

回复 45# aloha20200628

大佬,感觉应对特殊字符还是开启延迟变量扩展专业,如第7、8行无法处理 双引号
bat小白,请多指教!谢谢!

TOP

回复 55# qixiaobin0715


   大佬,您最后提出的新问题,我没看懂...
bat小白,请多指教!谢谢!

TOP

回复 55# qixiaobin0715


   大佬,我觉得几十个变量不会影响效率。尤其类似的简短变量 set #01=01,试着定义了5000个,耗时1秒左右,然后判断是否定义,echo %time%对比了下,时间相同。
12:07:14.02
12:07:15.26
1
12:07:15.26COPY


分别为定义开始时间、结束时间、判断是否被定义时间
bat小白,请多指教!谢谢!

TOP

回复 62# qixiaobin0715


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

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

评分人数

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

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

回复 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

返回列表