我想创建一个批处理文件,提示用户输入长度为6个数字的数字序列。我还想检查该输入是否包含例如数字5
中的三个。
@echo off
set /p UserInput=
if %UserInput% has........(
goto Number_Has_Three_5
)else(
goto Number_Dosent_Have_Three_5
)
这将检查输入是否仅包含数字,然后检查其中是否包含五个数字中的三个。
例如,数字111155
的长度为6个数字,但没有3个5,因此它将不起作用,并且会显示错误消息。
但是数字111555
由于数字5中有3个而不是2个,因此可以使用并且脚本将继续。
答案 0 :(得分:3)
这是要做4个不同任务的问题:
UserInput
是否不为空UserInput
numeric UserInput
6位数字UserInput
是否包含三个5s 但是,您的问题有两个歧义:
这三个5是否需要在一起(152535 = false
,123555 = true
)?
可以有三个以上的5(125555 = false
,555123 = true
)吗?
我的代码允许5s出现在6个字符串中的任意位置,如果其中至少有 个确切,则输出true。
:: ...
if not defined UserInput (
echo False. No Input.
goto:eof
)
set "testVar="
for /f "delims=0123456789" %%i in ("%UserInput%") do set testVar=%%i
if defined testVar (
echo False. Not Numeric.
goto:eof
)
set testVar=%UserInput%000000
if not %testVar:~0,6%==%UserInput% (
echo False. Not 6 digits.
goto:eof
)
set testVar=%UserInput:5=%
if not defined testVar goto:true
if not %testVar:~3,1%#==# (
echo False. Less than three 5s.
goto:eof
)
:: Edit: More than three 5s result in false
if %testVar:~2,1%#==# (
echo False. More than three 5s.
goto:eof
)
:true
echo True.
:: ...
答案 1 :(得分:1)
@echo off
:loop
set /p "userinput=Input: "
echo %userinput%|findstr /r "^[0-9][0-9][0-9][0-9][0-9][0-9]$" >nul || (
echo invalid input
goto :loop
)
set "nofives=%userinput:5=%0123456"
set /a fives=%nofives:~6,1%
echo %userinput% has %fives% fives.
if %fives% == 3 goto :three
goto :loop
:three
echo insert your payload here
findstr
检查输入是否恰好由6个数字组成。
set nofives...
删除所有5
并添加一个计数器字符串
%nofives:~6,1%
获得第七个字符(计数从零开始!),它是5的计数。
由于这有效地计数五位数(可扩展为最多9个数字的输入 1)),因此您可以自由地处理“恰好是三个”({{ 1}})或“最少三个”(if %fives% == 3
)或您想要的任何内容。
为演示其工作原理,我们假设if %fives% geq 3
为%userinput%
(只是为了避免与计数器字符串混淆)
如果我们从abcdef
中删除任何内容并添加计数器字符串,则它看起来像:
%userinput%
如果我们删除一个字符(abcdef-> abcdf)并添加计数器字符串,则它看起来像:
abcdef0123456
^ this char is the count (seventh char)
依次类推,直到“删除六个字符(对您来说这将是abcdf0123456
^ this char is the count (seventh char)
的用户输入)。然后看起来像:
555555
1),其中有两个微小变化,最多可扩展到15个数字(使用十六进制计数器字符串):
0123456
^ this char is the count (seventh char)