Проверка ввода командного файла - убедитесь, что пользователь ввел целое число

Я бы добавил:

Предоставить реальную отмену подписки при нажатии «Отменить подписку». Я видел реальные информационные бюллетени, содержащие фиктивную ссылку на отмену подписки, которая после кликов показывает, что «была успешно отписана», но я все равно буду получать дальнейшие информационные бюллетени.

13
задан Ross Ridge 19 May 2016 в 22:03
поделиться

8 ответов

Спасибо все. Я пытался мешать мне смотрящий на циклы и обработку строк. Я использовал Ваши подсказки относительно математической оценки и сравнения. Вот то, что я наконец придумал как свой сценарий понятия:

:Top
@ECHO OFF
ECHO.
ECHO ---------------------------------------
SET /P UserInput=Please Enter a Number: 
ECHO.
ECHO UserInput = %UserInput%
ECHO.
SET /A Evaluated=UserInput
ECHO Math-Evaluated UserInput = %Evaluated%
if %Evaluated% EQU %UserInput% (
    ECHO Integer
    IF %UserInput% GTR 0 ( ECHO Positive )
    IF %UserInput% LSS 0 ( ECHO Negative )
    IF %UserInput% EQU 0 ( ECHO Zero )
    REM - Other Comparison operators for numbers
    REM - LEQ - Less Than or Equal To
    REM - GEQ - Greater Than or Equal To
    REM - NEQ - Not Equal To
) ELSE (
    REM - Non-numbers and decimal numbers get kicked out here
    ECHO Non-Integer
)

GOTO Top

Этот метод ловит все числа и может обнаружить, положительно ли это, отрицательно, или нуль. Любое десятичное число или строка будут обнаружены как нецелые числа. Единственный пограничный случай, который я нашел, является строкой с пробелами. Например, текст "Номер 1" заставит сценарий отказывать/закрывать, когда ввод данных пользователем будет оценен как математика. Но в моей ситуации, это прекрасно. Я не хочу, чтобы мой сценарий продолжал недопустимый вход.

5
ответ дан 1 December 2019 в 19:32
поделиться

Вы, вероятно, не делаете этого в пакетном файле DOS. Или по крайней мере, поддержка set /p неслыханно для меня в DOS :-)

Вы могли использовать подстроки. На самом деле я записал синтаксический анализатор для определенного регулярного языка тот путь однажды, но это является громоздким. Самый легкий путь состоял бы в том, чтобы, вероятно, присвоить содержание %userinput% к другой переменной, с помощью set /a. Если результат выходит как 0 необходимо проверить, был ли сам вход 0, иначе можно прийти к заключению, что это было нечисло:

@echo off
setlocal enableextensions enabledelayedexpansion
set /p UserInput=Enter a number: 
set /a Test=UserInput
if !Test! EQU 0 (
  if !UserInput! EQU 0 (
    echo Number
  ) else (
    echo Not a number
  )
) else (
  echo Number
)

Однако это работает только на числа в диапазоне Int32. Если Вы просто заботитесь о каком-либо числе (возможно с плавающей точкой также) затем, необходимо обратиться к основанному на цикле подходу разделения его.

Примечание: Обновленный для решения проблем пространства. Однако существует все еще потаенная проблема: Ввод 123/5 урожаи "число", с тех пор set /a может оценить это...

15
ответ дан 1 December 2019 в 19:32
поделиться

Это - та же идея как идея Johannes.. НАБОР/A устанавливает числовое значение. Если вход не является числом, он изменяет его на 0. Это - то, что можно использовать здесь, чтобы сделать проверку.

@ECHO OFF
SET /P UserInput=Please Enter a Number:
IF %UserInput% EQU 0 GOTO E_INVALIDINPUT

SET /A UserInputVal="%UserInput%"*1
IF %UserInputVal% GTR 0 ECHO UserInput "%UserInputVal%" is a number
IF %UserInputVal% EQU 0 ECHO UserInput "%UserInputVal%" is not a number
GOTO EOF

:E_INVALIDINPUT
ECHO Invalid user input

:EOF

Как альтернатива, Вы могли всегда создавать немного файла JavaScript и называть его от Вашего batchfile. С parseInt () Вы могли вынудить вход быть целым числом, или Вы могли прокрутить свою собственную функцию для тестирования входа.

Запись JavaScript так же быстра как batchfile, но это намного более мощно. Никакой IDE или компилятор не требуются; блокнот сделает. Работает на каждом поле окон, точно так же, как Ваш batchfiles. Итак, почему бы не использовать его?

Можно даже смешать batchfiles и JavaScript. Пример:

содержание sleep.js:

var SleepSecs=WScript.Arguments.Item(0);
WScript.Sleep(SleepSecs*1000)

содержание sleep.cmd:

cscript /nologo sleep.js %1

Можно теперь назвать это от batchfile для создания сна сценария в течение 10 секунд. Что-то как этот трудно сделать только с плоскостью batchfile.

sleep 10
6
ответ дан 1 December 2019 в 19:32
поделиться

Вам также может понравиться этот - он короткий и простой. Этот использует трюк умножения, чтобы установить TestVal. Сравнение TestVal с UserInput позволяет пройти через все числовые значения, включая нули, только нечисловые значения вызовут оператор else. Вы также можете установить ErrorLevel или другие переменные, чтобы указать на неудачную запись

@ECHO OFF
SET TestVal=0

SET /P UserInput=Please Enter a Number:
SET /A TestVal="%UserInput%"*1

If %TestVal%==%UserInput% (
   ECHO You entered the number %TestVal%
   ) else ECHO UserInput "%UserInput%" is not a number

GOTO EOF

:EOF
1
ответ дан 1 December 2019 в 19:32
поделиться

В дополнение к замечанию об ошибке, которая возникает, когда пробелы являются частью ввода пользователя. Вы можете использовать errorlevel errorlevel = 9165. Его можно использовать для пробелов в строке или для обработки ошибок ввода «нет».

С уважением,

Эгберт

1
ответ дан 1 December 2019 в 19:32
поделиться
:ASK
SET /P number= Choose a number [1 or 2]: 
IF %number% EQU 1 GOTO ONE
IF %number% NEQ 1 (
  IF %number% EQU 2 GOTO TWO
  IF %number% NEQ 2 (
    CLS
    ECHO You need to choose a NUMBER: 1 OR 2.
    ECHO.
    GOTO ASK
  )
)

Для меня это прекрасно работает. Если он выберет числа меньше или больше, строки, плавающее число и т.д., он получит сообщение ("Вам нужно выбрать ЧИСЛО: 1 ИЛИ 2.") и INPUT будет запрошен снова.

.
0
ответ дан 1 December 2019 в 19:32
поделиться

вы можете заново изобрести колесо и отрастить несколько белых волосков, выполняя проверку строки пакетно, или вы можете использовать vbscript

strInput = WScript.Arguments.Item(0)
If IsNumeric(strInput) Then
    WScript.Echo "1"
Else
    WScript.Echo "0"
End If

, сохранив его как контрольную цифру. vbs и в вашем пакете

@echo off
for /F %%A in ('cscript //nologo checkdigit.vbs 100') do (
        echo %%A
        rem use if to check whether its 1 or 0 and carry on from here
)
0
ответ дан 1 December 2019 в 19:32
поделиться

Вы также можно использовать довольно простой трюк:

echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (echo not a number) else (echo number)

Здесь используются возможности сопоставления регулярных выражений findstr . Они не очень впечатляют, но иногда полезны.

4
ответ дан 1 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: