需要一些快速的帮助。 这是一个大学课程,除了当我打电话给我:forLoop方法遍历100个数字(1,1,100),从1开始直到100并且执行迭代%5(i %% 5)时,一切工作正常。 出于某种原因,我无法得到这个工作。 感谢任何帮助或方向。
当我回显%% A时,它会遍历所有完美的数字。 当我回声%结果%我得到一个空白的“”(里面没有)
:forLoop FOR /L %%A IN (1,1,100) DO ( set /A result=%%A %% 2 echo "%%A" echo "%result%" )
正确的代码是
:forLoop setlocal ENABLEDELAYEDEXPANSION FOR /L %%A IN (1,1,100) DO ( set /A result=%%A %% 5 echo !result! >> results.txt set /A total=!total!+!result! echo !total! )
问题在于当for
被读取时%result%
被替换,这意味着当循环被执行时它不再是一个变量。 你需要的是延迟变量扩展才能被启用,然后使用!
而不是%
:
setlocal ENABLEDELAYEDEXPANSION :forLoop FOR /L %%A IN (1,1,100) DO ( set /A result=%%A %% 5 echo "%%A" echo !result! )
这些都是在你运行SET /?
时得到的帮助信息中解释的SET /?
:
延迟的环境变量扩展对于解决问题很有用 当前一个线路发生的扩展的局限性 的文本被读取,而不是执行时。 下面的例子 演示了即时可变扩展的问题: 设置VAR =之前 如果“%VAR%”==“之前”( 设置VAR =之后 如果“%VAR%”==“之后”@echo如果你看到这个,它的工作 ) 从不会显示消息,因为在两个IF语句中%VAR% 在第一个IF语句被读取时被替换,因为它在逻辑上 包括IF的主体,这是一个复合语句。 所以 如果复合语句里面真的比较“之前”与 “之后”永远不会是平等的。 同样,下面的例子 将无法按预期工作: 设置LIST = (*)中的%i设置LIST =%LIST%%i 回声%LIST% 因为它不会建立当前目录中的文件列表, 而只是将LIST变量设置为找到的最后一个文件。 同样,这是因为%LIST%只是扩展一次 FOR语句被读取,当时LIST变量是空的。 所以我们正在执行的实际FOR循环是: (*)中的%i设置LIST =%i 它只是将LIST设置为找到的最后一个文件。 延迟的环境变量扩展允许您使用不同的扩展 字符(感叹号)来扩展环境变量 执行时间处理时间。 如果启用了延时变量扩展,则上面的 例子可以写成如下工作: 设置VAR =之前 如果“%VAR%”==“之前”( 设置VAR =之后 如果“!VAR!” ==“之后”@echo如果你看到这个,它的工作 ) 设置LIST = (*)中的%i设置LIST =!LIST! %一世 回声%LIST%