win cmd: set /a 值在 %value% 的后续操作中重新分配

win cmd: set /a value is reassigned on subsequent operations on %value%

尝试 运行 Windows cmd 中的一个单行(对 unix 俄罗斯轮盘赌的看法):

set /a nr=%random%*6/32768-0 & if %nr%==0 (echo lost) else (echo joy)

收益率,例如:

0 joy

3 lost

这毫无意义。因此,为 %nr% 添加回显:

set /a nr=%random%*6/32768-0 & echo "echo nr: %nr%" & if %nr%==0 (echo lost) else (echo joy)

结果:

0 "echo nr: 3" joy

1 "echo nr: 0" lost

问题很明显:为什么要重新分配变量? (重新分配只发生一次。如果使用 %nr% 的链式操作,它们将始终使用重新分配的值)。有人可以阐明这种行为吗?它很快就从烦人变成了莫名其妙。

谢谢,周末愉快。

批处理检查每一行,用该变量的当前值替换任何 %var%,然后执行结果行,因此,if 作用于变量的内容 之前它被分配了一个新值。

请阅读与 delayedexpansion 相关的数千个 SO 项目中的任何一个以了解解决策略,其中最简单的一个是使用两条单​​独的线

set /a nr=%random%*6/32768-0
if %nr%==0 (echo lost %nr%) else (echo joy %nr%)

set /a nr=%random%*6/32768-0
if %nr%==0 (
 echo lost %nr%
) else (
 echo joy %nr%
)

其中 if 语句的 5 行被视为一个 逻辑 行。

您没有说明是在提示符下还是从批处理中执行命令。那样就好了。