对于作业,我们的任务是从批处理中制作一个FOR循环,并从(1到100 mod 5)+ 3计算总计。我被卡住并可以使用一些帮助。
@ECHO off
:MAIN
FOR /L %%i IN (1,1,100) DO (
SET A=%%i
SET B=5
SET /A C=A%%B
IF %C%==0 GOTO TOTAL
:TOTAL
SET NUM=C+3
)
非常感谢!
答案 0 :(得分:4)
@ECHO OFF
SETLOCAL
:MAIN
SET /a C=0
FOR /L %%i IN (1,1,100) DO (
SET /A C+=%%i
)
SET /a NUM=C %% 5 +3
ECHO num=%num%
GOTO :EOF
第一个问题:没有setlocal
,您的环境在运行之间会持续存在。因此,您在任何变量set
a
b
c
(批量大部分不区分大小写)中拥有num
的任何值都将成为您的起始值接下来在同一个cmd
会话中运行批处理。
包含setlocal
表示批量结束时您将对环境所做的任何更改都将被丢弃。
下一个问题:目前还不清楚你的意思是((1到100之和)mod 5)+ 3或(1到(100 mod 5)之和)+ 3。我从{{1}开始就假设了前者} = 0,从1到0的总和没什么意义(对我来说)。
下一步:100 mod 5
循环在“块”(带括号的行序列)中不能包含标签,因为它会终止块。
下一步:整个块首先for
(检查语法有效性)然后执行。批量替换块中的任何parsed
及其值解析时间,因此%var%
将替换为 nothing ,因为%C%
不是在达到c
命令时定义。因此,该命令将替换为
for
因此,作为IF ==0 GOTO TOTAL
语句的批处理对象应为if
。因此,它看到if string1 operator string2 action
所需的运算符(如goto
)并生成错误消息。
由于你并非绝对知道任何变量都不会被定义,所以谨慎地初始化你的变量(因此我发布的替换中的==
。)
下一步 - 如果SET /a C=0
成为c
,您为何要摆脱循环?似乎没有原因来做到这一点。这是可能的 - 但是您需要使用0
来访问循环中的值,因为它会发生变化(运行时值。)这超出了您所知道的范围。到目前为止,如果您感兴趣,delayedexpansion
上有数百篇SO文章。
所以 - 我发布的代码的工作方式是将delayedexpansion
设置为0,以便将其设置为已知值,以防万一它恰好是开头的其他内容。
然后,对于{1}的每个值,从1到100,将c
添加到%%i
。另一个有效的方法是
%%i
然后将c
设置为(c mod 5)并添加3,然后显示它。
批量指定 set /a c=c+%%i
(num
运算符)的优先级高于%
,因此在mod运算后执行添加。您还可以对元素进行分组:
mod
这些空间仅仅是为了便于阅读。
+
是必需的,因为 set /a num=(c %% 5) + 3
需要%%
- 也就是说,批量中的特殊含义需要关闭,因此%
之前是escaped
另一个%
因为%
是%
的转义字符。如果您需要转义其他字符,则需要使用插入符号(%
)。