有人可以告诉我如何制作批处理文件输入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中有一个数学表达式而不仅仅是一个简单的比较)?
谢谢:)
答案 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