0
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. 

我到底做错了什么?多谢你们

4

2 回答 2

2

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

您应该意识到的第一件事是,您需要使用&OR 将语句分开,并将它们放在单独的行上,否则右侧的 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为0。VAR %% 5CAL

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

FOR 循环从 FOR 到结束括号进行解析。在 PARSE-TIME,any%var%被变量的 THEN-CURRENT 值替换。然后执行代码。

由于在 PARSE 时既没有var也没有cal设置,所以将执行的是

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

所以你会SET CAL在线路上得到一个“缺少操作数”的错误,并ECHO会及时报告“Echo is OFF”(或视情况而定)。

要克服这些问题,您需要添加一些更改...

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 之间变化,我已经更改了计算以允许看到更改,并且CALECHO 报告了varcal

于 2013-03-28T21:11:01.613 回答
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%%
)
于 2013-03-28T22:57:26.120 回答