Проверьте, соответствует ли пользовательский ввод требованиям и проанализируйте его - PullRequest
0 голосов
/ 09 июня 2019

Я хочу создать пакетный файл, который предлагает пользователю ввести числовую последовательность длиной 6 цифр. Я также хочу проверить, включает ли этот вход, например, три числа 5 в нем.

@echo off
set /p UserInput=
if %UserInput% has........(
goto Number_Has_Three_5
)else(
goto Number_Dosent_Have_Three_5
)

Это будет проверять, есть ли на входе только цифры, а затем, если есть три из числа пять в нем.

Например, число 111155 имеет длину шесть цифр, но не имеет трех пятерок, поэтому оно не будет работать и перейдет к сообщению об ошибке.

Но число 111555, поскольку в нем три из числа пять вместо двух пятерок, сработает, и сценарий продолжится.

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

Это вопрос выполнения 4 разных задач:

Однако в вашем вопросе есть две неясности:
Должны ли три пятерки быть вместе (152535 = false, 123555 = true)?
Может ли быть больше трех 5 (125555 = false, 555123 = true)?

Мой код допускает, чтобы 5 были в любом месте строки из 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 голос
/ 09 июня 2019
@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%, получаетседьмой символ (отсчет начинается с нуля!), то есть число пятерок.

Поскольку это эффективно подсчитывает число пятерок (расширяемое до ввода максимум девяти чисел 1) ), вы можете обрабатывать "ровно три" (if %fives% == 3) или «минимум три» (if %fives% geq 3) или что угодно.

Чтобы показать, как это работает, давайте предположим, что %userinput% равно abcdef (только чтобы не путать его со строкой счетчика)Если мы ничего не удалим из %userinput% и добавим строку счетчика, это будет выглядеть так:

abcdef0123456
      ^ this char is the count (seventh char)

Если мы удалим один символ (abcdef -> abcdf) и добавим строку счетчика, это будет выглядеть так:

abcdf0123456
      ^ this char is the count (seventh char)

и так далее до тех пор, пока «не удалите шесть символов (для вас это будет пользовательский ввод 555555). Тогда это выглядит так:

0123456
      ^ this char is the count (seventh char)

1) с двумя небольшими изменениями, расширяемыми до 15 чисел (с использованием шестнадцатеричной строки счетчика):

set "nofives=%userinput:5=%0123456789ABCDEF"
set /a fives=0x%nofives:~6,1%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...