2017-10-07 61 views
0

我正在制作一个简单的批处理脚本来找出批处理脚本中的数组。批处理文件似乎设置为2无缘由的变量

代码:

@echo off 
setlocal EnableDelayedExpansion 
set inputCount=0 
set outputCount=0 

:input 
cls 
set /p !number%inputCount%!=Input %inputCount%: 
set /a inputCount=%inputCount%+1 
if %inputCount% geq 3 goto output 
goto input 

:output 
cls 
echo !number%outputCount%! 
set /a outputCount=%outputCount%+1 
if %outputCount% geq 3 goto exit 
goto output 

:exit 
pause 
echo exit 

第4行中,我设置outputCount0,我再不要改变outputCount直到第16行,我添加1它。

我预计第16行的输出是outputCount=0+1=1因此使得outputCount=1。但是,当我使用echo on运行代码以确切查看它在做什么时,第16行的输出为outputCount=2+1=3,设置为outputCount3

看起来程序设置outputCount2而不是0在16行之前的某一点,但我不明白为什么。

+0

在每次迭代中清除屏幕时,只能看到':output'循环的最后一次执行。尝试删除'cls'命令的代码 –

+0

这看起来不正确。 set/p!number%inputCount%! – Squashman

+0

如上所述,_unless在代码片段之前未包含将变量设置为'number0','number1'和'number2'的代码。如果你没有设置这些变量,那么你可能应该从'set/p'和'echo'语句中删除感叹号,并删除那些不必要的'setlocal EnableDelayedExpansion'行。 – Compo

回答

0

首先,看看Debugging a batch file,因为这是您需要学习编码批处理文件的一课。

其次,请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?的答案,该答案提供了有关在命令提示符窗口set /?中运行的帮助输出的附加信息。

它看起来像你想定义的环境变量number0,number1number2与用户输入分配给他们的字符串。

该命令用来提示输入串的用户要么是

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%: 

的字符串用户输入,如果不只是RETURNENTER由上提示用户命中,应分配给环境变量,其名称的存储在环境变量number0number1number2。但环境变量number0,number1number2永远不会由您的批处理文件定义,因为您的意图是将输入字符串存储到名称为number0,number1number2的变量中。所以这个命令行是最后的执行:

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之后的字符串是算术表达式,它与命令行上的任何其他字符串完全不同。例如,环境变量的当前值可以通过仅使用变量名来引用,而不包围百分号或感叹号。这使得可以在不使用延迟扩展的情况下,在命令块中使用变量在算术表达式中的一个IFFOR命令块。在命令提示符窗口中运行set /?的帮助输出可以很好地解释这种不同的解析行为,以及在算术表达式中可以使用哪些运算符,如+=

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

  • cls /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

一些更多的提示:

不要在一个批处理文件中使用刚刚exit,使用exit /Bgoto :EOF,看到Where does GOTO :EOF return to?

验证后,用户输入的所有东西和输入的字符串实际上是一个数字(十进制,八进制或十六进制),请确保根据您和用户的期望正确处理数字。我的意思在这里证明有:

@echo off 
set "Number=020" 
set /A Number+=1 
echo Result=%Number% 
pause 

你有什么期望的结果,21或实际输出结果17

0开头的数字字符串被解释为八进制数字。以0x0X开头的数字字符串被解释为十六进制数字。将020更改为008,结果为1。为什么? 008对八进制数无效,因此用0代替,后者加1。