带有是/否的我的for循环给出了转移输出

时间:2018-01-04 20:45:18

标签: batch-file scripting

有时候我按Y它会转到:没有

有时我按N它会转到:是的

我做错了什么?

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

只有通话才是好消息。

希望有人可以帮助我

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

1 个答案:

答案 0 :(得分:0)

在执行命令之前,Windows命令解释程序在整个命令块的预处理期间,扩展了以%VariableName%开头并以匹配(开头的命令块中以)引用的每个环境变量。最后执行已经预处理的命令块。

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

在命令提示符窗口set /?中运行,并将帮助输出读入控制台窗口。 delayed environment variable expansion的用法通过 IF FOR 示例的帮助解释,通常使用命令块。

但是有一个更好的解决方案可以完成此任务,然后启用延迟扩展。不使用set /P INPUT=[Y/N]:,而是使用命令 CHOICE ,退出时根据用户按下的键,退出代码分配给ERRORLEVEL。在这种情况下,如果用户按ERRORLEVEL1作为第一个指定选项,则Yy;如果是2或{{N 1}}被用户按下。其他值是不可能的。

另请参阅Microsoft支持文章Testing for a Specific Error Level in Batch Files,说明如何在不使用延迟扩展的情况下在命令块中批处理文件中评估n

ERRORLEVEL

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • 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 /?

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解set /?<的说明。重定向运算符2>nul必须使用 FOR 命令行上的符号字符>进行转义,以便在Windows命令解释程序在执行命令 FOR之前处理此行时将其解释为文字字符,它在后台启动的单独命令进程中执行嵌入式^命令行。

另见Where does GOTO :EOF return to?