这个批处理文件中可能有什么问题



我试图让用户输入数字,如果他们错过了一个数字,我希望程序删除一条错误消息。但是,如果未定义则不起作用。

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的解决方案将起作用,但仍有两个问题:

  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

Space被视为分隔符,因此这将被解析为

对于(4分离器序列5分离器序列6…)中的%%A,如果

因此,丢失的值-er将丢失。

如果你使用了...%var%...if...defined,那么由于456不是定义的环境变量,你会得到"如果没有定义"的意外行为(即"没有以我预期的方式工作,但对自己保持")

另一种方法是

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

这将被解释为

对于%%A IN("4"分离器序列"分离器序列"5",…)如果[%%~A]==[]进入错误

这里,"4""""5"将分别被分配给%%A——包括引号。波浪号(~)删除了括引号,因此[%%~A]将按预期计算为[]

相关内容

  • 没有找到相关文章

最新更新