这种情况最好的方法是什么?

时间:2014-05-06 14:22:31

标签: batch-file

有人可以告诉我如何制作批处理文件输入5个数字并检查每个数字,如果它甚至是奇怪的?我不知道我对模块部分做错了什么:

@echo off

for /l %%i IN (1,1,5) DO (
                    set /p num1=
                    set /a "mod=%num1% %% 2"
                    echo mod=%mod%
                    if mod EQU 0 (echo EVEN!)else echo ODD!
                    echo.
                  )
echo 5 numbers were inputed.
echo.
pause

和另一个问题:我是否可以声明num1变量并检查它是否在if内部(在if中有一个数学表达式而不仅仅是一个简单的比较)?

谢谢:)

1 个答案:

答案 0 :(得分:2)

您无法在IF语句中进行数学计算。

以下是您的代码存在的一些问题:

  • 解析语句时会发生正常扩展,并且一次解析FOR循环中的所有代码。所以%mod%扩展为一个常量值 - 在FOR循环开始之前存在的值(如果未定义mod,则为空字符串)。

  • 如果要在IF语句中使用变量,则必须展开变量。

不是错误 - 但是数字变量不需要扩展以在SET / A语句中使用它们。

这是一个解决方案 - 让循环调用一个子程序,每次迭代都会重新解析:

@echo off
setlocal
for /l %%i in (1,1,5) do call :test
echo 5 numbers were inputed.
echo(
pause
exit /b

:test
set /p "num1=Enter a number: "
set /a "mod=num1 %% 2"
echo mod=%mod%
if %mod% EQU 0 (echo EVEN!)else echo ODD!
echo(

另一种选择是启用和使用延迟扩展。如果启用了延迟展开,则必须将未加引号的!文字转义为^^!。此处不需要,但引用的!将被转义为"^!"

@echo off
setlocal enableDelayedExpansion
for /l %%i in (1,1,5) do (
  set /p "num1=Enter a number: "
  set /a "mod=num1 %% 2"
  echo mod=!mod!
  if !mod! EQU 0 (echo EVEN^^!)else echo ODD^^!
  echo(
)
echo 5 numbers were inputed.
echo(
pause
exit /b

如果您不需要打印mod值,可以使用数学技巧来避免使用CALL或延迟扩展。您可以除以mod值,如果mod为0,它将引发错误。您可以使用&&成功(奇数)和||失败(偶数)有条件地采取行动。

@echo off
for /l %%i in (1,1,5) do (
  set /p "num1=Enter a number: "
  set /a "1/(num1 %% 2)" 2>nul &&echo ODD!||ECHO EVEN!
  echo(
)
echo 5 numbers were inputed.
echo(
pause
exit /b