Как задать вопрос, но умеет писать только цифры? - PullRequest
0 голосов
/ 07 апреля 2019
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

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

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

Ответы [ 3 ]

2 голосов
/ 07 апреля 2019
@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 delimited создает токен со значением 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", не вызовет ошибки и не будет принят как число vaild, так как имеет двойные кавычки.


Ссылки:

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

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

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

0 голосов
/ 07 апреля 2019

Вы можете попробовать встроить код 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);
0 голосов
/ 07 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...