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
您会用什么来换取带有“->”的行
您可能会以某种方式阻止某人完全写除数字之外的任何东西,或者使之成为批处理文件仅读取数字的方法,而不是破坏批处理文件,而是随机编写一些东西? (此文本上方的示例)
答案 0 :(得分: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
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 :(得分:0)
您可以尝试嵌入Powershell代码:
objectValue
优点之一是,它可以支持Integer,Double,Unsigned integer等类型(在这种情况下为Double)。
您还可以尝试使用嵌入式jscript代码(可以在旧的XP计算机上使用):
<# : 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"
答案 2 :(得分:-3)
您不能在==
比较中使用空格。您的代码显示if %NewPenaltyLimit%<space>==<space>Numbers??
,它将永远不会匹配。