使用 for 循环搜索字符串中的特定字符,以检查 Batch 中的时间格式



我正在编写一个脚本,用户必须在其中投入时间。我遇到的问题是用户可以输入任何内容,批处理脚本会接受它。我检查这一点的想法是提取冒号在输入时间内的位置,并检查它是否存在:

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:Test2018614SO_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

最新更新