Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用for循环在字符串中搜索特定字符以批量检查时间格式_Batch File_For Loop_Substring - Fatal编程技术网

Batch file 使用for循环在字符串中搜索特定字符以批量检查时间格式

Batch file 使用for循环在字符串中搜索特定字符以批量检查时间格式,batch-file,for-loop,substring,Batch File,For Loop,Substring,我正在编写一个脚本,用户必须在其中输入时间。我遇到的问题是,用户可以输入任何内容,批处理脚本将接受它。我检查这一点的想法是提取输入时间中冒号的位置,并检查它是否存在: SET check=%utime:2,1% IF %check%==: [continue with script] 因此,它将跳过01:00中的前两个字符并提取分号,将其设置为check,然后比较check,查看它是否为冒号。这很有效,但后来我意识到用户可以在第三个空格中输入任何带有冒号的内容并通过。对于第一步,我检查这一点的

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

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
将是一个true或false变量(0或1),然后我可以使用
IF
语句对其求值,以查看其格式是否有效。但最终发生的情况是
conf
被设置为0,但它没有正确检查
time
变量中的字符。保持echo打开,我可以看到
check
设置不正确,这意味着无论用户输入什么,conf始终设置为0。以下是上下文中讨论的代码以防万一(此部分仅用于检查是否存在5个字符):


也许使用
FindStr
会比较合适:

:开始
设置“uTime=”
设置/P“uTime=请插入时间(hh:mm):”
设置“uTime=%uTime:~,5%”
如果未定义uTime转到:开始
Echo%uTime%| FindStr/R“[0-1][0-9]:[0-5][0-9]2[0-3]:[0-5][0-9]”>Nul |转到:开始
Echo感谢您输入有效时间!
暂停

有点不同的方法,然后复合

:: Q:\Test\2018\06\14\SO_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

这太棒了!我遇到的唯一问题是,它似乎没有检查时间后的字符,例如12:00qwer通过罚款。有没有办法检查时间后面的字符是否为空?我尝试只使用空括号,但无效。24:59不是有效时间;-)@Pitdroid,我增加了一行,将变量限制在输入的前五个字符内,如果他们使用
12:00qwer
,变量将设置为
12:00
,如果他们输入
qwer12:00
,变量将不会作为有效字符通过。谢谢!这涵盖了我需要的一切。你能告诉我最后一行的
^
$
是做什么的吗?它似乎捕获了字符串之后或之前的任何内容,但我不想假设某些内容,也不希望它是对的。在正则表达式中,
^
锚定在开始处,
$
锚定在结束处。我包括这些,以避免拖尾或导致其他字符。我还允许以单个数字的形式输入our作为有效的例外。9:21不是有效时间;-)@Compo你是对的,应该把它改成包含一个前导零。所以在把它弄乱并编辑实现到我自己的使用中之后,我注意到,
无论发生什么都会通过。如果它本身或在一个字符串中,它总是通过,你们知道这是为什么还是我如何阻止它吗?
Echo=%~1|Findstr "^[0-1][0-9]:[0-5][0-9]$ ^2[0-3]:[0-5][0-9]$" 2>&1>Nul || Exit /B 1