为什么在我在提示中输入某些内容时,CMD为什么说“ =此时是意外”并关闭?

时间:2018-09-30 20:39:28

标签: windows batch-file

最近,我看到了一个VSauce 2视频,该视频可以永远赢取,我制作了一个程序,让玩家可以与计算机进行游戏。问题是轮到用户时,当您输入数字(或其他任何数字)时,程序将关闭。我和一个也编程的朋友试图解决此问题,但没有任何效果。认为您可以提供帮助?

这是不断弄糟的代码块:

:usr
cls
echo.
echo SUM: %tot%
echo.
echo LAST ENTRY:
echo COMPUTER: %com%
echo YOU: %usr%
echo.
echo.
set/p usr=ENTER A NUMBER BETWEEN 1 AND 10: 
if "%usr%" => "11" (
goto usr
)
if "%usr%" =< "0" (
    goto usr
)
set/a tot=%tot%+%usr%
if "%tot%" == "100" (
    goto win
)
if "%tot%" => "101" (
    goto lose
) else (
    goto com
)

每个GOTO都会走到其他存在的地方

1 个答案:

答案 0 :(得分:0)

1。 usr作为标签和变量的名称

usr用作标签和环境变量名称并不是一个好主意,因为这样会使搜索标签或变量usr变得困难。


2。无效的参数=><=

=><=不是命令 IF 的有效比较运算符。打开命令提示符窗口,然后运行if /?获取此命令的帮助,并列出所有受支持的运算符。

可以在带有参数cmd.exe的命令提示符窗口中执行/?的任何内部命令,以显示该命令的帮助。而且,大多数外部命令(目录%SystemRoot%\System32中的控制台应用程序输出)也有助于以/?作为参数来运行它们。


3。整数与字符串比较

GEQ(大于或等于)这样的运算符被设计为主要用于带符号的32位整数比较。通过将两个要比较的参数括在双引号中,Windows命令处理器不再可能将双引号的字符串转换为整数,因此由 IF 执行字符串比较。

字符串"2"大于字符串"11"。两个比较字符串的第一个字符为",十进制代码值34在两个字符串上均相等。第二个字符是2,左字符串的十进制代码值50大于1,右字符串的十进制代码值49,因此字符串"2"大于字符串{{ 1}}。

有关字符串与整数比较的更多详细信息,请阅读Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files

上的答案

4。正确的命令语法

命令行"11"不好,因为set/p usr=ENTER A NUMBER BETWEEN 1 AND 10: 必须先在命令行上应用自动更正,然后才能执行。

更好的是:

cmd.exe

参数0是命令set /P "usr=ENTER A NUMBER BETWEEN 1 AND 10: "

使用空格将命令与命令的第一个参数set分开。

再有一个空格用于分隔第二个参数/P,该参数用双引号引起来,因为它包含一个或多个空格。在这种特殊情况下,这里不需要将参数字符串括在双引号中,因为命令 SET 具有特殊的参数字符串解析功能,而其他命令和应用程序则没有,但是最好将其括起来。用这种形式用双引号引起的第二个参数可以看到尾随空格,并且永远不会自动删除它,例如,通过文本编辑器可以在文件保存时修剪尾随空格。

由于对命令variable=prompt text的另一个特殊解析(与选项usr="ENTER A NUMBER BETWEEN 1 AND 10: "一起使用),也可能是set。但是前一种语法更好,因为它可以用在/P的每一种用法上,而不仅仅是用于提示用户输入字符串。

有关更多详细信息,请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?

上的答案

5。 setset /P

在使用choice提示用户输入字符串时,用户可以自由输入任何内容或输入用户要求的内容或输入完全不同的内容,这可能会给进一步处理字符串带来很多麻烦用户输入字符串。

有关更多详细信息,请参见How to stop Windows command interpreter from quitting batch file execution on an incorrect user input?

在这种情况下,对于故障安全代码,需要这样的代码:

set /P

要确保用户输入的字符串范围在1到10之间,这是很多代码。

更好的代码将使用外部命令 CHOICE ,在命令提示符窗口中运行@echo off :GetValue set "UserValue=" set /P "UserValue=Enter a number between 1 and 10: " rem Has the user not entered any string? if not defined UserValue goto GetValue rem Remove all double quotes from entered string. set "UserValue=%UserValue:"=%" rem Is there no string left anymore? if not defined UserValue goto GetValue rem Does the string contain any other character than a digit? for /F delims^=0123456789^ eol^= %%I in ("%UserValue%") do goto GetValue rem Remove all leading zeros because of an integer with a leading 0 rem is interpreted on IF comparsion below as an octal number and 08 rem and 09 would be interpreted as 0 because of invalid octal numbers. :RemoveLeadingZeros if "%UserValue:~0,1%" == "0" ( set "UserValue=%UserValue:~1%" if not defined UserValue goto GetValue goto RemoveLeadingZeros ) rem More than two digits are not allowed for a number in range 1 to 10. rem This check must be done because of the user could enter also the rem string 12345678901234567890 which is greater maximum positive 32-bit rem integer value 2147483647 supported on conversion from string to integer. if not "%UserValue:~2,1%" == "" goto GetValue rem A value greater 10 is not allowed as also value 0 detected already rem on removing leading zeros because of TempValue not defined anymore. if %UserValue% GTR 10 goto GetValue echo You entered the value %UserValue%. pause 时会获得帮助输出,解释如下:

choice /?

这很容易,并且由于 CHOICE ,用户甚至不会输入错误,只有 1 2 ,..., 0 Ctrl + C 退出批处理文件执行。

也可能是:

@echo off
%SystemRoot%\System32\choice.exe /C 1234567890 /N /M "Enter 1 to 0 (=10): "
set "UserValue=%ERRORLEVEL%"
echo You entered the value %UserValue%.
pause

结果与以前相同,因为 0 导致退出 CHOICE ,退出代码为%SystemRoot%\System32\choice.exe /C 0123456789 /N /M "Enter 0 to 9: " 9 退出代码为1


6。 10可能无法输出空白行

DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/解释了echo.何时无法输出空白行。最好使用echo.echo/输出空白行。

在这种特殊情况下,由于遵循命令 ECHO 的非常特殊的参数字符串解析,因此忽略了仅由空格/制表符组成的参数字符串并显示状态{{ 1}}或echo(,而无需非空白参数字符串。


7。故障安全重写的批处理代码

这是重写的批处理代码,具有故障保护功能。

off

即使在未定义环境变量on的情况下,命令行@echo off :UserInput cls echo/ echo SUM: %tot% echo/ echo LAST ENTRY: echo COMPUTER: %com% echo YOU: %usr% echo/ echo/ %SystemRoot%\System32\choice.exe /C 0123456789 /N /M "Enter 0 to 9: " set /A tot+=%ERRORLEVEL% if %tot% EQU 100 goto win if %tot% GTR 100 goto lose echo Reached code for "com". goto :EOF :win echo Reached code for "win". goto :EOF :lose echo Reached code for "lose". 也可以工作。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • set /A tot+=%ERRORLEVEL%
  • tot
  • choice /?
  • cls /?
  • echo /?
  • goto /?