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.
我究竟做错了什么?谢谢你们
答案 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 代码已执行。
由于var
和cal
都未设置为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报告var
和cal
的运行时间值{{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%%
)