如何提问但只能写数字?

时间:2019-04-06 22:12:05

标签: 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

您会用什么来换取带有“->”的行

您可能会以某种方式阻止某人完全写除数字之外的任何东西,或者使之成为批处理文件仅读取数字的方法,而不是破坏批处理文件,而是随机编写一些东西? (此文本上方的示例)

3 个答案:

答案 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分隔没有标记,因为12都是分隔符。

如果允许启用延迟扩展。 此版本可以处理输入而不会删除双引号:

@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??,它将永远不会匹配。