我在批处理程序中练习,所以我正在尝试编写一个包含循环和算术指令。我写了以下代码:
@echo off
SET /a i=1
FOR /F %%A IN ('DIR /B') DO (
SET /a i += %i% + %i% + 4
ECHO %i%)
但每行的答案都是1!
我尝试用SET /a "i += %i% + %i% + 4"
编写此代码,但答案是一样的。
我查了here
和here
但我发现没有任何与此错误有关的信息
即使我删除了上述行中包围的空格,但答案是一样的。
答案 0 :(得分:1)
与set /a i=1
不同set /a i = 1
。在第二种情况下,您可以定义名称中带有空格的变量。
如果您不使用/a
算术开关,set i= 1
,则=
之后的空格将包含在变量的值中。
但是通过这些更正,您的问题就是其他问题
@echo off
setlocal enabledelayedexpansion
SET /a "i=1"
FOR /F %%A IN ('DIR /B') DO (
SET /a "i+=i+i+4"
ECHO !i!
)
endlocal
当解析代码块(括号内的代码)时,所有变量读取都将替换为变量中的值开始执行块之前。因此,如果在代码块中使用%i%
,因为在开始执行之前,此变量读取已替换为变量的值,您将看不到更改的值回显到控制台,但是初始{{ 1}}价值。变量正在更改其值(执行1
),但由于set
命令不访问变量,而是在循环开始之前使用其值,因此所有迭代都会回显相同的值
如果在代码块中更改了变量并且需要在同一代码块中访问更改的值,则需要启用延迟扩展,并且在echo
到%i%
的所需变量访问中更改语法!i!
表示解析器在执行命令之前应该延迟对变量值的访问。