2014-12-06 69 views
0

这是我有:如何访问在同一个FOR循环中设置的FOR循环中的环境变量?

FOR /f %%G IN (school\students\%studentname%\classes.txt) DO (
    set /p grade=<"school\students\%studentname%\classes\%%G\grade.txt" 
    pause 
    echo %grade% 
    echo You Have %grade% in %%G 
) 
pause 

我的问题是,我回来:

You have in Math. 
You have in English. 

在grade.txt文件,我有一个的A和其他A B。 %% G在整个FOR命令中设置为英语和数学,并找到文件夹。但%grade%变量由于某种原因未设置。我无法弄清楚为什么。谢谢

回答

0

如果我正确理解了您的文件夹结构,下面的内容将起作用。就像这样:

  • 学生\名1 \ class1的
  • 。 。 。 。 。 。 。 \ \。 。 。 。 。 。 \ class2
  • 。 。 。
  • students \ name2 \ class1
  • 。 。 。 。 。 。 。 \ \。 。 。 。 。 。 \ class2

。 。 。,并且classes.txt位于名称文件夹中,而grade.txt文件位于每个类文件夹中。


@echo off 
    set /p studentname="Enter student name: " 
    set studentpath=C:\school\students\%studentname% 

     For /f %%G in (%studentpath%\classes.txt) do (
     For /f %%i in (%studentpath%\%%G\grade.txt) do (
      echo %studentname% got %%i in %%G 
     ) 
    ) 

    pause 

您需要设置正确的studentpath

外循环从classes.txt中读取一个类,并将值(类名)赋值给%% G。然后内部循环运行以获得该类的等级,该等级被分配给%% i。结果得到回应,我们回到下一课的外部循环。这可以避免在for循环中设置任何变量,而只是使用参数%% G和%% i作为输出,从而避免DelayedExpansion(explained here)的问题。

请注意,此嵌套循环设置仅适用,因为内部循环只需循环一次 - 从grade.txt中为单个类获取单一等级。

使用“嵌套循环,对于外部循环的每次迭代全部迭代的内部执行”。 [@MCND]。因此,例如,如果grade.txt包含两个类的等级,则每个类都在单独的行上,如下所示:
。 a
。b
结果将是:
。学生名字得到了一个数学
。学生名字在数学中得到b
。学生名字有英文
。学生名字得到b英文

+0

上面的答案没有用,但是你的原始响应与嵌套for循环一起工作得很完美。再次感谢@sjoy如果你可以加回来,那会很棒。 – TonyStark 2014-12-07 21:49:19

+0

行@TonyStark。回到以前的答案。惊讶的读取文件的set/p方法没有工作,因为我测试了一切,但很好,这就是你所需要的。 – sjoy 2014-12-07 22:38:34

0

也许你会有更好的结果,如果你使用" "echo工作?即echo "$VARIBALE"

+0

没有这没有产生更好的结果。我得到的只是'你在'数学'中有'“ – TonyStark 2014-12-06 20:03:31

1

您需要延迟expansion

@echo off 

set "student=school\students\%studentname%\classes.txt" 

setlocal enableDelayedExpansion 
FOR /f %%G IN (%student%) DO (
set /p grade=<%student% 
    pause 
echo !grade! 
echo You Have !grade! in %%G 
) 
pause 

endlocal 

但档次将永远是相同的 - set /p grade=<file只读取文件的第一行。 和%%G将只能访问该文件的第一个单词。检查令牌和分隔符选项。

+0

我应该更清楚一点。每个班级都有一个文件夹,并且是一个grade.txt文件。所以我想把%grade%设置为每个班级文件夹文本文件中的成绩。要查找的类文件夹我想要由classes.txt文件中的类名确定,然后将类文件夹的路径作为%% G,然后放入%% H等。因此,classes.txt中的每个类都将在其文件夹中查找grade.txt,然后等级回显。我希望这是有道理的。除非延迟扩张会解决这个问题。但我不知道延迟扩张是什么。对不起,冗长的解释... – TonyStark 2014-12-06 19:53:49

+0

我也尝试使用上面的答案,但它产生了相同的结果。 @npocmaka – TonyStark 2014-12-06 20:50:38

+0

@TonyStark将会更容易让你用例子来解释 – npocmaka 2014-12-07 19:30:35