我正在编写一个脚本,用户必须在其中投入时间。我遇到的问题是用户可以输入任何内容,批处理脚本会接受它。我检查这一点的想法是提取冒号在输入时间内的位置,并检查它是否存在:
SET check=%utime:2,1%
IF %check%==: [continue with script]
这样它就会跳过 01:00 中的前两个字符并提取分号,将其设置为check
,然后比较check
以查看它是否是冒号。这很好用,但后来我意识到用户可以在第三个空格中输入任何带有冒号的内容并过去。第一步,我检查这一点的想法是让一个FOR
循环检查所有五个可能的空格,看看它们是否为空,使用以下代码:
SET conf=1
FOR /L %%i IN (1,1,5) DO (
echo %%i
SET check=%utime:%%i,1%
IF [%check%] == [] SET conf=0
)
conf
将是一个真或假变量(0 或 1(,然后我可以使用IF
语句对其进行评估,然后查看它是否是有效的格式。但最终发生的事情是conf
设置为 0,但它没有正确检查time
变量中的字符。保持回声打开,我可以看到check
设置不正确,这意味着无论用户输入什么conf
它始终设置为 0。这是上下文中存在问题的代码,以防万一(此部分仅用于检查是否存在 5 个字符(:
:Start
SET /p utime=Please insert the time (hh:mm):
CALL :CheckTime
IF conf EQU 1 goto :Valid
ECHO Please enter a valid time!
GOTO :Start
:Valid
ECHO Thank you for entering a valid time!
PAUSE
EXIT
:CheckTime
SET conf=1
FOR /L %%i IN (1,1,5) DO (
echo %%i
SET check=%utime:%%i,1%
IF [%check%] == [] SET conf=0
)
EXIT /B
一种稍微不同的方法,然后是Compo。
:: Q:Test2018 614SO_50860883.cmd
@Echo off
:Start
Set "MyTime="
SET /p MyTime=Please insert the time (hh:mm):
If not defined MYTime Exit /B 0
CALL :CheckTime "%MyTime%"|| (ECHO Please enter a valid time! &GOTO :Start)
ECHO Thank you for entering a valid time %MyTime% !
ECHO=
goto :Start
:CheckTime passed value not a fixed var
Echo=%~1|Findstr "^[0-9]:[0-5][0-9]$ ^[0-1][0-9]:[0-5][0-9]$ ^2[0-3]:[0-5][0-9]$" 2>&1>Nul || Exit /B 1
要不允许输入个位数小时,请将最后一行更改为:
Echo=%~1|Findstr "^[0-1][0-9]:[0-5][0-9]$ ^2[0-3]:[0-5][0-9]$" 2>&1>Nul || Exit /B 1
也许使用FindStr
是合适的:
:Start
Set "uTime="
Set /P "uTime=Please insert the time (hh:mm): "
Set "uTime=%uTime:~,5%"
If Not Defined uTime GoTo :Start
Echo %uTime% |FindStr /R "[0-1][0-9]:[0-5][0-9] 2[0-3]:[0-5][0-9]">Nul||GoTo :Start
Echo Thank you for entering a valid time!
Pause