我试图让用户输入数字,如果他们错过了一个数字,我希望程序删除一条错误消息。但是,如果未定义则不起作用。
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命令。当所有变量都输入为空时,我该怎么做才能使其工作?
只是一种不同的方法:
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
不会处理未定义的变量(这是原始代码的问题)
另一个优点是,现在您可以判断有多少变量是正确定义的(如果您想知道的话)
Aacini的解决方案将起作用,但仍有两个问题:
- 为什么"如果没有定义"不起作用
和 - 为什么你发布的命令不起作用
正如您所提供的,cmd
将把for
命令解释为
for %%A in (aas_value, bas_value, abs_value, ...) do if
所以如果你输入了4,什么都没有,5,6…那么命令行将是
for %%A in (4, , 5, 6...) do if
、和Space被视为分隔符,因此这将被解析为
对于(4分离器序列5分离器序列6…)中的%%A,如果
因此,丢失的值-er将丢失。
如果你使用了...%var%...
和if...defined
,那么由于4
、5
和6
不是定义的环境变量,你会得到"如果没有定义"的意外行为(即"没有以我预期的方式工作,但对自己保持")
另一种方法是
for %%A IN ("%aa%", "%ba%", "%ab%",...) DO IF [%%~A]==[] goto error
这将被解释为
对于%%A IN("4"分离器序列"分离器序列"5",…)如果[%%~A]==[]进入错误
这里,"4"
、""
、"5"
将分别被分配给%%A
——包括引号。波浪号(~)删除了括引号,因此[%%~A]
将按预期计算为[]
。