#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.