Проверка входного файла пакета - убедитесь, что пользователь ввел целое число
Я экспериментирую с пакетным файлом 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")