使用带有模数运算符的批处理for循环

时间:2013-03-28 20:30:58

标签: windows command-line batch-file

for /L %%i in (1, 1, 100) do (           
    SET VAR=%%i %% 5
    set /a CAL=%VAR% %% 5
    echo %CAL%
)

嘿伙计们这里是上面的简单代码,我试图获取索引并在每个增量上使用%5。

命令行给了我:

SET VAR = 100 % 5
set /a CAL = % 5
Missing operand. 

我究竟做错了什么?谢谢你们

2 个答案:

答案 0 :(得分:2)

需要更好地解释您打算做什么。试图从不起作用的代码中找出你想要的东西就变成了猜谜游戏。

您应该意识到的第一件事是您需要将语句与&分开或将它们放在不同的行上,否则右侧的ENTIRE表达式将分配给VAR

我会假设你的意思是

for /L %%i in (1, 1, 100) do (
 SET VAR=%%i %% 5 
 set /a CAL=%VAR% %% 5 
 echo %CAL%
)

现在我们无法从中得知你真正想要实现的目标。也许您想将val设置为表达式%%i %% 5的值您需要/A开关

for /L %%i in (1, 1, 100) do (
 SET /A VAR=%%i %% 5 
 set /a CAL=%VAR% %% 5 
 echo %CAL%
)

现在 - 下一行,您是否尝试将CAL设置为%VAR% %% 5的值?好吧 - 有几个问题 - 首先,VAR将是0..4所以将CAL设置为VAR %% 5会将CAL设置为0,无论如何。

第二个问题更为重要,并延伸到下一行。

FOR循环从FOR到最终括号进行解析。在PARSE-TIME,任何%var%都被变量的THEN-CURRENT值替换。 THEN 代码已执行。

由于varcal都未设置为PARSE时间,因此将执行的是

for /L %%i in (1, 1, 100) do (
 SET /A VAR=%%i %% 5 
 set /a CAL= %% 5 
 echo 
)

因此,SET CAL行会出现“缺少操作数”错误,而ECHO会及时报告“Echo is OFF”(视情况而定为ON)。

要克服这些问题,你需要添加一些改变......

SETLOCAL ENABLEDELAYEDEXPANSION
for /L %%i in (1, 1, 100) do (
 SET /A VAR=%%i %% 5 
 set /a CAL=!VAR! %% 3 
 echo !VAR! !CAL!
)

请注意SETLOCAL ENABLEDELAYEDEXPANSION建立一种模式,其中%var%仍然返回PARSE-TIME值但!val!返回RUN-TIME值 - 当它发生变化时。由于VAR会在0到4之间变化,因此我更改了CAL的计算以允许更改,并且ECHO报告varcal的运行时间值{{1}}

答案 1 :(得分:0)

以下两个代码会产生相同的结果。第一个使用DelayedExpansion并且更快,第二个没有VAR

@echo off &setlocal enabledelayedexpansion
for /L %%i in (1, 1, 100) do (
    SET /a VAR=%%i %% 5
    set /a CAL=!VAR! %% 5
    echo !CAL!
)

@echo off &setlocal
for /L %%i in (1, 1, 100) do (
    set /a CAL="(%%i%%5)%%5"
    call echo %%CAL%%
)