2015-11-28 49 views
0

我想让用户输入数字,如果他们错过了一个我希望程序删除错误消息。但是,如果未定义不起作用。这个批处理文件有什么问题

set /p aa=a11: 
set /p ba=a12: 
set /p ba=a12: 
set /p ab=a21: 
set /P bb=a22: 
cls 
echo antra matrica 
echo. 
set /p qq=b11: 
set /p wq=b12: 
set /p qw=b21: 
set /P ww=b22: 
for %%A IN (%aa%, %ba%, %ab%, %bb%, %qq%, %wq%, %qw%, %ww%) DO IF [%%A]==[] goto error 

它忽略了for命令。当所有变量都输入空白时,我能做些什么来使其工作?

+3

'对于%% A IN(aa,ba,ab,bb,qq,wq,qw,ww)DO IF NOT DEFINED %%转到错误' – Aacini

回答

0

只是一个不同的方法:

set Count=0 
for %%A IN (%aa%, %ba%, %ab%, %bb%, %qq%, %wq%, %qw%, %ww%) DO set /a Count+=1 
if %Count% neq 8 goto error 

这需要一个事实,即一个未定义的变量不会与for处理的优势(这是你原来的代码问题)

另一个优点是,现在你可以知道,有多少变量被正确定义(如果你想知道)

+0

谢谢:)它helpt –

+0

顺便说一句:你可以删除逗号或空格(连续的分隔符被视为一个)但他们不打扰,你也可以离开这两个更好的readabiltiy。 – Stephan

0

Aacini的解决方案将工作,但有两个问题是:

  1. 为什么没有“如果没有定义”工作?

  2. 为什么你没有发布的命令工作?

正如你所提供的,cmd会解释for命令

for %%A in (aas_value, bas_value, abs_value, ...) do if 

所以有您输入4,没什么,5,6 ......然后在命令行是

for %%A in (4, , 5, 6...) do if 

SPAC È被视为分离器,因此这将在被解析为

为%% A(4 separatorsequence separatorsequence 6 ...)做,如果

因此缺少的值 - 呃,失踪了。

如果你使用...%var%...if...defined则由于456没有定义的环境变量,你会得到“如果没有定义的”演技意外(即“不工作,我所期望的方式,但有保持自己“)

另一种方法是

for %%A IN ("%aa%", "%ba%", "%ab%",...) DO IF [%%~A]==[] goto error 

这将被解读为

为%% A IN( “4” separatorsequence “” separatorsequence “5”,...)DO IF [%%〜A] == []转到错误

这里,"4","","5"将分别指定为%%A - 包括引号。代字号()删除封闭的引号,因此[%%~A]将按照预期评估为[]

+0

谢谢你。 :) –