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

Я экспериментирую с пакетным файлом Windows, чтобы выполнить простую операцию, которая требует от пользователя ввода неотрицательного целого. Я использую простые методы пакетного файла, чтобы получить пользовательский ввод:

@ECHO OFF
SET /P UserInput=Please Enter a Number: 

Пользователь может ввести любой текст, который им нужен здесь, поэтому я хотел бы добавить некоторую рутину, чтобы убедиться, что введенный пользователем действительный номер. То есть... они ввели по крайней мере один символ, и каждый символ имеет число от 0 до 9. Я хотел бы что-то, в которое я могу впитать UserInput. В конце процедуры будет выглядеть как if, тогда будет выполняться несколько операторов, основанных на том, действительно ли это действительное число.

Я экспериментировал с циклами и подстроками и такими, но мои знания и понимание по-прежнему тонкие... так что любая помощь будет оценена.

Я мог бы создать исполняемый файл, и я знаю, что есть более приятные способы делать что-то, чем командные файлы, но по крайней мере для этой задачи я пытаюсь сохранить его простым, используя командный файл.

Ответ 1

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

: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" приведет к сбою/закрытию script, когда пользовательский ввод оценивается как математика. Но в моей ситуации это прекрасно. Я не хочу, чтобы мой script продолжался с недопустимым вводом.

Ответ 2

Вероятно, вы не делаете этого в пакетном файле 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 может оценить это...

Ответ 3

Это та же идея, что и Йоханнес.. SET/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 и вызвать его из своего пакетного файла. С помощью parseInt() вы можете принудительно ввести ввод в целое число, или вы можете перевернуть свою собственную функцию для проверки ввода.

Написание javascript так же быстро, как и пакетный файл, но гораздо более мощный. Нет необходимости в IDE или компиляторе; блокнот сделаю. Работает на каждом окне окна, точно так же, как ваши файлы партии. Так почему бы не использовать его?

Вы даже можете смешивать пакетные файлы и javascript. Пример:

содержимое sleep.js:

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

содержимое sleep.cmd:

cscript /nologo sleep.js %1

Теперь вы можете вызывать это из пакетного файла, чтобы сделать ваш script сон в течение 10 секунд. Что-то вроде этого трудно сделать только с простым пакетным файлом.

sleep 10

Ответ 4

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

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

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

Ответ 5

Как указано ghostdog74, ответы, опубликованные Joey Mar 26 '09 (оценка 10) и Wouter van Nifterick 26 марта 2009 года (оценка 5), не работают.

Ответ, поставленный Джо Мар 25 '10 (оценка 2), работает, за исключением того, что символы перенаправления и '&' вызывают синтаксические ошибки.

Я думаю, что лучшим и самым простым решением является сообщение, отправленное Sager Oct 8 '14 (оценка 0). К сожалению, у него есть опечатка: "% a" должно быть "% a%".

Здесь командный файл, основанный на ответе Sager. Переназначенные символы и '&' на входе не вызывают проблем. Единственные проблемы, которые я мог найти, были вызваны строками, содержащими двойные кавычки.

@echo off & setlocal enableextensions & echo.
set /p input=Enter a string:
SET "x=" & for /f "delims=0123456789" %%i in ("%input%") do set x=%%i
if defined x (echo Non-numeral: "%x:~0,1%") else (echo No non-numerals)

Ответ 6

Вам также может понравиться этот - это короткий и легкий. Это используется трюк умножения для установки 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

Ответ 7

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

С уважением,

Эгберт

Ответ 8

Я знаю, что это лет, но просто чтобы поделиться своим решением.

set /p inp=Int Only : 
:: Check for multiple zeros eg : 00000 ::
set ch2=%inp%-0
if %inp% EQU 0 goto :pass
if [%inp%]==[] echo Missing value && goto :eof
if %inp:~0,1%==- echo No negative integers! && goto :eof
set /a chk=%inp%-10>nul
if %chk%==-10 echo Integers only! && goto :eof
:pass
echo You shall pass
:eof

Протестировано и работает в Windows 8.

Ответ 9

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

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

Ответ 10

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

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

сохраните его как checkdigit.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
)

Ответ 11

@echo off setlocal enableextensions enabledelayedexpansion set/p UserInput = Введите число: set/a Test = UserInput если! EQU 0 ( если! UserInput! EQU 0 (   номер эха ) else (   echo Не число ) ) else ( номер эха )

yeaph everthing is great но вы забыли про одну мелочь 0 также является цифрой ; (

Ответ 12

Это более удобный для пользователя способ.

if %userinput%==0 (
cls
goto (put place here)
)
if %userinput%==1 (
cls
goto (put place here)
)
if %userinput%==2 (
cls
goto (put place here)
)
if %userinput%==3 (
cls
goto (put place here)
)
if %userinput%==4 (
cls
goto (put place here)
)
if %userinput%==5 (
cls
goto (put place here)
)if %userinput%==6 (
cls
goto (put place here)
)if %userinput%==7 (
cls
goto (put place here)
)
if %userinput%==8 (
cls
goto (put place here)
)
if %userinput%==9 (
cls
goto (put place here)
)

Это может использоваться для ввода любого типа пользователя.

Ответ 13

Вы можете использовать подпрограмму ReadFormattedLine для всех видов форматированного ввода. Например, приведенная ниже команда считывает число до пяти цифр:

call :ReadFormattedLine UserInput="#####" /M "Please Enter a Number: "

Эта подпрограмма написана в чистой папке, поэтому она не требует дополнительной программы и позволяет выполнять несколько форматированных операций ввода, например, читать пароли. В предыдущем примере подпрограмма считывает число до пяти цифр. Вы можете загрузить подпрограмму ReadFormattedLine из Прочитать строку с определенным форматом.

Ответ 14

Вы можете проверить любую переменную, если ее номер:

SET "var="&for /f "delims=0123456789" %i in ("%a") do set var=%i
if defined var (echo."NIC">nul) else (echo."number")