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
Что бы вы поставили взамен строки с "-->"
Возможно ли, что вместо того, чтобы ломать пакетный файл и писать что-то случайное, вы могли бы как-то запретить кому-то писать что-либо, кроме чисел, или сделать так, чтобы пакетный файл читал только числа? (Кто какой пример над этим текстом)
Вы не можете использовать пробелы вокруг ==
сравнений. Ваш код говорит if %NewPenaltyLimit%<space>==<space>Numbers??
, который никогда не будет совпадать.
если %NewPenaltyLimit%<space>==<space>Numbers?? Я надеялся, что кто-нибудь сможет ответить на эту строку, извините, я не придал ей смысла.
Поэтому уберите пробелы вокруг ==
.
if 1 == 1 echo match
@Noodles Значит, это никогда не должно совпадать? Я вижу match
эхом. Я могу вставить больше пробелов, удалить пробелы по обе стороны от ==
и все равно совпадения.
Этот «ответ» совершенно неверен. ==
сравнивает токен слева с токеном справа. Любое количество разделителей токенов может лежать по обе стороны от ==
. Единственным ограничением является то, что разделитель токенов =
не может отображаться слева от ==
, только справа. Например, if abc ,; == ,;= abc echo match
соответствует abc
.
Я думаю, вы путаете правила IF с SET. Это правда, что у вас не должно быть пробела по обе стороны от =
при выполнении задания SET.
@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 /?
об отложенном расширении.
: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
Обновленный ответ на основе незначительных различий кода в вашем комментарии. Я не понимаю ссылку на видео, которая включает "Не удалось найти C:\...", так как ничто в коде не может быть причиной этого. Если это полный код, то, вероятно, он все еще находится в стадии разработки. Спасибо за информацию. Убедитесь, что ваше сообщение с вопросом обновляется по мере необходимости.
@ArandomGuy, сообщение об ошибке, которое вы указали в своей ссылке на видео, выводится из-под метки :lock
в вашем пакетном файле (часть, где вы прячете специальную папку). Нам нужно будет увидеть этот конкретный раздел файла, чтобы исправить это, но, поскольку технически это выходит за рамки вашего вопроса, вам следует задать новый вопрос, если вам нужна помощь в исправлении этого. В вашем видео вы, кажется, использовали, и код принял gg
для ввода penalty
. Вы задаете Майклу вопросы, которые не имеют отношения к его ответу, потому что вы явно не работаете с его кодом.
Вы можете попробовать внедрить код 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);
Вы можете запустить переменную с помощью команды
FindStr
. Если вы откроете окно командной строки и введетеfindstr /?
, вы сможете прочитать информацию об использовании. Я мог бы предложить вам обратить особое внимание на нечисловой диапазон. Затем вы сможете посмотреть на командыIf
иGoTo
, чтобы создать цикл при определенных условиях.