@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 /?
о задержке расширения.