关于批处理文件:带有是/否的我的for循环给出不同的输出

My for loop with Yes/No give diverent output

有时我按Y键,结果是:不

有时我按N键,它转到:是的。

我做错什么了?

现在应该循环3次,这不是问题

只有打过电话才不好。

希望有人能帮助我

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CD %INSTALLDIR%
SET test=
FOR /f %%a in ('dir /b /o:-n') do (
SET test=%%a
  ECHO Generate a answer file for %test%?
  set INPUT=
  set /P INPUT=[Y/N]:
  IF /I '%INPUT%'=='y' call :yes
  IF /I '%INPUT%'=='n' call :no
  )
  goto end
:yes
cd %test%
  SET APPNAME=<%test%.options
  for /f"tokens=1*" %%b in (%test%.options) do set OPTIONS=%%b
  echo %APPNAME%
  echo %OPTIONS%
goto end

:no
echo Skipping %%a
goto end

:end
ECHO NEXT


在Windows命令解释器对整个命令块进行预处理的过程中,在执行最终执行已预处理的命令块之前,Windows命令解释器对命令块进行预处理时,扩展了命令块中以(开始、以匹配的)结束的每个与%VariableName%引用的环境变量。

这意味着在执行命令for之前,%INPUT%被环境变量INPUT的值替换。上面的命令批处理文件中没有定义环境变量INPUT,因此命令块中的比较取决于此环境变量的存在及其在启动批处理文件时的当前值。

在命令提示窗口set /?中运行,并将帮助输出读取到控制台窗口中。延迟环境变量扩展的用法由有关if和for示例的帮助解释,通常使用命令块。

但对于这个任务,有一个更好的解决方案,然后启用延迟扩展。不使用set /P INPUT=[Y/N]:,而是使用命令选项退出,根据用户按下的键,该命令选项将退出代码分配给ERRORLEVEL。在这种情况下,如果用户按YY作为第一个指定选项,那么ERRORLEVEL就是1;如果用户按NN则是2。其他值不可能。

另请参阅Microsoft支持文章测试,了解批处理文件中的特定错误级别,解释如何在不使用延迟扩展的情况下,在批处理文件中甚至在命令块中评估ERRORLEVEL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd /D"%INSTALLDIR%"
for /F %%I in ('dir /AD /B /O:-N 2^>nul') do (
    %SystemRoot%\System32\choice.exe /C YN /N /M"Generate an answer file for %%I [Y/N]?"
    if errorlevel 2 (echo Skipping %%I) else call :GetOptions"%%I"
)
goto :EOF

:GetOptions
cd /D"%~1"
set APPNAME=<"%~1.options"
for /F"usebackq" %%J in ("%~1.options") do set"OPTIONS=%%J"
echo %APPNAME%
echo %OPTIONS%
goto :EOF

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

  • call /?
  • cd /?
  • choice /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • set /?

还可以阅读有关使用命令重定向操作符来解释<2>nul的Microsoft文章。重定向运算符>必须以插入字符^开转义,以便在Windows命令解释器在执行命令之前处理该行,并在后台启动的单独命令进程中执行嵌入的dir命令行时,将命令行解释为文字字符。

另请参见goto:eof返回到哪里?