Board logo

标题: [其他] [语法]批处理中的for与延迟变量 [打印本页]

作者: riscrisc    时间: 2017-4-21 15:50     标题: [语法]批处理中的for与延迟变量

小弟最近在学批处理的for命令和变量延迟,发现一个问题想不通,特此请教大神。实验代码如下:

::延迟变量实验
@echo off
for /l %%i in (1,1,%num%) do (set S%%i=8)
echo S1
for /l %%i in (1,1,%num%) do (
  echo %%i
  echo %S%%i%)

我的问题是为啥第二个for中的echo %S%%i%显示不出来?我知道这个和延迟变量有关,但是我不明白的是既然S1~S10已经在第一个for中定义过了,而且直接echo S1都显示正常,那为什么在第二个for中%S%%i%却认不出来?难道预编译的时候只退去第一层%%导致代码被预编译为echo S%%i??求大神指教,谢谢。
作者: taofan712    时间: 2017-4-21 16:35

echo;%s%%i%在这里等于echo;%s%  %i%
  1. @echo off
  2. set s=999
  3. set a=888
  4. for /l %%i in (1,1,1) do (set S%%i=8)
  5. echo;%S1%
  6. for /l %%a in (1,1,1) do (
  7.   echo;%%a
  8.   echo;%S%%a%
  9. )
  10. pause
复制代码
你这样测试,仔细观看。
作者: riscrisc    时间: 2017-4-21 23:27

谢谢大神指点
我起初始终把%%a看做一个变量了
没想到%S%%a%还能分成%S%和%a%啊,,,
因为一开始我还做了个实验,用了延迟变量
::set s=999
::set a=888
for /l %%i in (1,1,1) do (set S%%i=8)
echo;%S1%
setlocal enabledelayedexpansion
for /l %%a in (1,1,1) do (
  echo %%a
  echo %S%%a%
  echo !S%%a!
)
屏蔽掉s和a的定义以后,我发现如果用了延迟变量,第二个for里的第三个echo是能显示的,而第二个echo却不能,所以当时无法理解,现在解释通了,谢谢




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2