Как задать вопрос, но умеющий записывать только числа?

#batch-file

#пакетный файл

Вопрос:

 set PenaltyLimit = 0

:NewPass
echo Create a penalty limit 
set/p "NewPenaltyLimit=>"
--> if %NewPenaltyLimit%==Numbers?? do (
@echo %NewPenaltyLimit% >> File/PenaltyLimit.txt)
FOR /F "usebackq tokens=* delims=" %%W in ("File/PenaltyLimit.txt") do SET PenaltyLimit=%%W
goto lock

:Fail2
@set /a penalty = %penalty%   1
if %penalty%==%penaltylimit% goto DELETE
goto FAIL
  

Что бы вы поставили в обмен на строку с «—>»

Возможно ли, что вы могли бы каким-то образом либо полностью запретить кому-либо записывать что-либо, кроме чисел, либо сделать так, чтобы пакетный файл читал только числа, вместо того, чтобы ломать пакетный файл, записывая что-то случайное? (Кто-нибудь, какой пример над этим текстом)

Комментарии:

1. Вы могли бы рассмотреть возможность запуска переменной с помощью FindStr команды. Если вы откроете окно командной строки и введете findstr /? , вы сможете прочитать информацию о его использовании. Я мог бы посоветовать вам обратить особое внимание на не числовой диапазон . Возможно, тогда вы сможете просмотреть команды If и GoTo для создания цикла при определенном условии.

Ответ №1:

 @echo off
setlocal

:NewPass
echo Create a password
set/p "newpass=>" || goto :NewPass
:NewPenaltyLimit
cls

echo Create a penalty limit, Numbers only
set /p "NewPenaltyLimit=>" || goto :NewPenaltyLimit
set "NewPenaltyLimit=%NewPenaltyLimit:"=%"
if not defined NewPenaltyLimit goto NewPenaltyLimit
for /f "delims=1234567890" %%A in ("%NewPenaltyLimit%") do goto NewPenaltyLimit

cls
ping localhost -n 2 > nul
echo You chose %NewPenaltyLimit% goto lock
  

Если вы разделите значение %NewPenaltyLimit% целыми числами
из 1234567890 , do goto :newPass должно произойти только
если существуют символы, отличные от целых чисел.

Из-за возможности ввода в set /p приглашение двойных кавычек, что может вызвать синтаксическую ошибку при развертывании в виде текста при разборе кода. Двойные кавычки будут заменены (удалены) из входного значения сразу после ввода. Это означает, что "86" станет 86 и будет принято как действительное число.

Пример значений:

  • a1 разделитель создает токен со значением a , который вызывает goto :NewPenaltyLimit выполнение.
  • 12 разделитель не создает токен, поскольку 1 и 2 оба являются разделителями.

Разрешено ли включать отложенное расширение. Эта версия может обрабатывать ввод без удаления двойных кавычек:

 @echo off
setlocal

:NewPass
echo Create a password
set/p "newpass=>" || goto :NewPass
:NewPenaltyLimit
cls

echo Create a penalty limit, Numbers only
set /p "NewPenaltyLimit=>" || goto :NewPenaltyLimit
setlocal enabledelayedexpansion
for /f "delims=1234567890" %%A in ("!NewPenaltyLimit!") do (
    endlocal
    goto NewPenaltyLimit
)
endlocal

cls
ping localhost -n 2 > nul
echo You chose %NewPenaltyLimit% goto lock
  

Отложенное расширение требуется только для for цикла,
так что это может быть лучшая версия.

!NewPenaltyLimit! не раскрывается в коде при разборе кода, что означает, что ввод, такой как "86" , не вызовет ошибки и не будет принят как число вайлда, поскольку оно заключено в двойные кавычки.


Ссылки:

  • Просмотрите for /? для получения более полезной информации.

  • Просмотрите set /? информацию о замене, используемой в этом ответе.

  • Просмотр setlocal /? и if /? информация о задержке расширения.

Комментарии:

1. gyazo.com/4f9f9e51adb8c778401df889cef2f5c2 Здесь я просто приведу вам полный код :NewPass echo Create a password set/p "newpass=>" cls echo Create a penalty limit, Numbers only set /p "NewPenaltyLimit=>" || goto :NewPass cls set "NewPenaltyLimit=%NewPenaltyLimit:"=%" if not defined NewPenaltyLimit goto NewPass for /f "delims=1234567890" %%A in ("%NewPenaltyLimit%") do goto NewPass ping localhost -n 2 > nul echo You chose %NewPenaltyLimit% goto lock

2. Обновленный ответ, основанный на незначительных отличиях кода в вашем комментарии. Я не понимаю ссылку на видео, которая включает » Не удалось найти C: … «, поскольку ничто в коде не может вызвать это. Если это полный код, то, вероятно, над ним все еще ведется работа. Спасибо за информацию. Пожалуйста, убедитесь, что ваш вопрос обновляется по мере необходимости.

3. @ArandomGuy, сообщение об ошибке, которое вы указали в своей ссылке на видео, выводится из-под :lock метки в вашем пакетном файле, (та часть, где вы скрываете специальную папку) . Нам нужно было бы просмотреть этот конкретный раздел файла, чтобы исправить это, но поскольку технически это выходит за рамки вашего вопроса, вам следует задать новый вопрос, если вам требуется помощь в исправлении этого. В вашем видео вы, похоже, использовали, и код принял, gg для penalty ввода. Вы задаете Майклу вопросы, которые не имеют отношения к его ответу, потому что вы явно работаете не с его кодом.

Ответ №2:

Вы можете попробовать внедрить код powershell:

 <# : batch portion
@echo off amp; setlocal

    for /f "tokens=*" %%a in ('powershell -noprofile "iex (${%~f0} | out-string)"') do set "number=%%a"
    echo you've entered %number%

endlocal
goto :EOF

: end batch / begin powershell #>

do {
  [Console]::Error.Write("Enter a number:")
  $inputString = read-host
  $value = $inputString -as [Double]
  $ok = $value -ne $NULL
  if ( -not $ok ) {[Console]::Error.WriteLine("You must enter a numeric value") }
}
until ( $ok )

write-host "$value"
  

Одним из преимуществ является то, что это может поддерживать несколько типов, таких как Integer, Double, целое число без знака и так далее (в данном случае это Double .)

Вы можете попробовать также со встроенным кодом jscript (может использоваться на старых компьютерах с XP):

 @if (@X) == (@Y) @end /* JScript comment 
    @echo off 

        for /f "tokens=*" %%a in ('cscript //E:JScript //nologo "%~f0" "%~nx0" %* ') do set "number=%%a"
        echo you've entered %number%

    exit /b %errorlevel%       
@if (@X)==(@Y) @end JScript comment */


WScript.StdErr.Write("Enter a number:");
WScript.StdIn.Read(0);
var strMyName = WScript.StdIn.ReadLine();
var num=parseInt(strMyName);

while(isNaN(num)){
    WScript.StdErr.Write("Enter a number:");
    WScript.StdIn.Read(0);
    var strMyName = WScript.StdIn.ReadLine();
    var num=parseInt(strMyName);
}

WScript.StdOut.WriteLine(num);
  

Ответ №3:

Вы не можете использовать пробелы вокруг == сравнений. В вашем коде указано if %NewPenaltyLimit%<space>==<space>Numbers?? , которое никогда не будет соответствовать.

Комментарии:

1. если %NewPenaltyLimit%<пробел>==<пробел> Числа?? Я надеялся, что кто-нибудь сможет ответить на эту строку, извините, я не придал этой строке смысла.

2. Итак, удалите пробелы вокруг == .

3. if 1 == 1 echo match @Noodles Значит, это никогда не должно совпадать? Я вижу match эхо. Я могу вставить больше пробелов, убрать пробелы с обеих сторон == и все равно совпадать.

4. Этот «ответ» совершенно неверен. == Сравнивает токен слева с токеном справа. Любое количество разделителей токенов может находиться по обе стороны от == . Единственным ограничением является то, что = разделитель токенов не может отображаться слева от == , только справа. Например, if abc ,; == ,;= abc echo match приводит к совпадению abc .

5. Я думаю, вы путаете правила IF с SET. Это правда, что у вас не должно быть пробела ни с одной стороны = при выполнении задания SET.