首先,看看Debugging a batch file,因为这是您需要学习编码批处理文件的一课。
其次,请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?的答案,该答案提供了有关在命令提示符窗口set /?
中运行的帮助输出的附加信息。
它看起来像你想定义的环境变量number0
,number1
和number2
与用户输入分配给他们的字符串。
该命令用来提示输入串的用户要么是
set /P "variable=prompt text: "
或
set /P variable="prompt text: "
在一般推荐第一变型尽管最经常不使用批处理文件编码新手因为不知道如何使用双引号将字符串分配给环境变量。第二个变体是特定于set /P
也是可能的,并且在一些非常罕见的情况下确实需要,但是以我的观点应该避免使用,因为使用set
而不使用/P
时,双引号解释为不同。
因此,让我们看看你的代码与rem
四大行注释掉,附加与set
下一行的批处理文件的末尾,并在命令提示符窗口中运行该批处理文件:
rem @echo off
setlocal EnableDelayedExpansion
set inputCount=0
set outputCount=0
:input
rem cls
set /p !number%inputCount%!=Input %inputCount%:
set /a inputCount=%inputCount%+1
if %inputCount% geq 3 goto output
goto input
:output
rem cls
echo !number%outputCount%!
set /a outputCount=%outputCount%+1
if %outputCount% geq 3 goto exit
goto output
:exit
rem pause
echo exit
set number
输出结束时只有一行NUMBER_OF_PROCESSORS=2
。没有环境变量number0
,number1
,number2
,其也将由set number
输出。和命令行echo !number%outputCount%!
在文件结果三次中的信息即ECHO is OFF
。
查看输出命令行后,通过Windows命令解释器预处理每行之后,可以看到原因。
set /p !number%inputCount%!=Input %inputCount%:
的字符串用户输入,如果不只是RETURN或ENTER由上提示用户命中,应分配给环境变量,其名称的存储在环境变量number0
,number1
和number2
。但环境变量number0
,number1
和number2
永远不会由您的批处理文件定义,因为您的意图是将输入字符串存储到名称为number0
,number1
和number2
的变量中。所以这个命令行是最后的执行:
set /p =Input 0:
set /p =Input 1:
set /p =Input 2:
这些命令行会导致因为语法错误的批处理的出口,但这并不在这里发生,因为延迟扩展的使用,因为它可以看出在控制台窗口中。
的解决方案是分批代码如下:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Index=0"
:Input
cls
set /A Index+=1
set /P "Number%Index%=Input %Index%: "
if not %Index% == 3 goto Input
cls
set "Index=0"
:Output
set /A Index+=1
if defined Number%Index% echo Number%Index%=!Number%Index%!
if not %Index% == 3 goto Output
endlocal
这个批处理文件的上输入上第一提示Hello!
的输出,在第二提示什么和第三提示Bye!
是:
Number1=Hello!
Number3=Bye!
好的,我们还没有输入数字,因为我们可以自由输入任何东西,从无到有,如Double quote " or | or <or> are bad inputs on user prompt
这样的坏字符串被提示输入。但批处理文件现在按预期工作。
还请注意,set /A
之后的字符串是算术表达式,它与命令行上的任何其他字符串完全不同。例如,环境变量的当前值可以通过仅使用变量名来引用,而不包围百分号或感叹号。这使得可以在不使用延迟扩展的情况下,在命令块中使用变量在算术表达式中的一个IF或FOR命令块。在命令提示符窗口中运行set /?
的帮助输出可以很好地解释这种不同的解析行为,以及在算术表达式中可以使用哪些运算符,如+=
。
为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cls /?
echo /?
endlocal /?
goto /?
if /?
rem /?
set /?
setlocal /?
个
一些更多的提示:
不要在一个批处理文件中使用刚刚exit
,使用exit /B
或goto :EOF
,看到Where does GOTO :EOF return to?
验证后,用户输入的所有东西和输入的字符串实际上是一个数字(十进制,八进制或十六进制),请确保根据您和用户的期望正确处理数字。我的意思在这里证明有:
@echo off
set "Number=020"
set /A Number+=1
echo Result=%Number%
pause
你有什么期望的结果,21
或实际输出结果17
?
以0
开头的数字字符串被解释为八进制数字。以0x
或0X
开头的数字字符串被解释为十六进制数字。将020
更改为008
,结果为1
。为什么? 008
对八进制数无效,因此用0
代替,后者加1。
在每次迭代中清除屏幕时,只能看到':output'循环的最后一次执行。尝试删除'cls'命令的代码 –
这看起来不正确。 set/p!number%inputCount%! – Squashman
如上所述,_unless在代码片段之前未包含将变量设置为'number0','number1'和'number2'的代码。如果你没有设置这些变量,那么你可能应该从'set/p'和'echo'语句中删除感叹号,并删除那些不必要的'setlocal EnableDelayedExpansion'行。 – Compo