Как задать вопрос, но умеет писать только цифры?

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

Что бы вы поставили взамен строки с "-->"

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

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

Compo 07.04.2019 02:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
137
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

A random Guy 07.04.2019 00:30

Поэтому уберите пробелы вокруг ==.

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

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

dbenham 07.04.2019 18:50

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

dbenham 07.04.2019 18:52
Ответ принят как подходящий
@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 delimited не создает токена, так как 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 /? об отложенном расширении.

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
A random Guy 08.04.2019 06:34

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

michael_heath 08.04.2019 09:40

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

Compo 08.04.2019 13:07

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

<# : batch portion
@echo off & 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, Unsigned integer и т. д. (в данном случае это 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);

Другие вопросы по теме