Я бы добавил:
Предоставить реальную отмену подписки при нажатии «Отменить подписку». Я видел реальные информационные бюллетени, содержащие фиктивную ссылку на отмену подписки, которая после кликов показывает, что «была успешно отписана», но я все равно буду получать дальнейшие информационные бюллетени.
Спасибо все. Я пытался мешать мне смотрящий на циклы и обработку строк. Я использовал Ваши подсказки относительно математической оценки и сравнения. Вот то, что я наконец придумал как свой сценарий понятия:
: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" заставит сценарий отказывать/закрывать, когда ввод данных пользователем будет оценен как математика. Но в моей ситуации, это прекрасно. Я не хочу, чтобы мой сценарий продолжал недопустимый вход.
Вы, вероятно, не делаете этого в пакетном файле 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
может оценить это...
Это - та же идея как идея 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
Вам также может понравиться этот - он короткий и простой. Этот использует трюк умножения, чтобы установить 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
В дополнение к замечанию об ошибке, которая возникает, когда пробелы являются частью ввода пользователя. Вы можете использовать errorlevel errorlevel = 9165. Его можно использовать для пробелов в строке или для обработки ошибок ввода «нет».
С уважением,
Эгберт
: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 будет запрошен снова.
.вы можете заново изобрести колесо и отрастить несколько белых волосков, выполняя проверку строки пакетно, или вы можете использовать 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
)
Вы также можно использовать довольно простой трюк:
echo %userinput%|findstr /r /c:"^[0-9][0-9]*$" >nul
if errorlevel 1 (echo not a number) else (echo number)
Здесь используются возможности сопоставления регулярных выражений findstr
. Они не очень впечатляют, но иногда полезны.