【问题标题】:How to access an environment variable in a FOR loop set in same FOR loop?如何访问同一 FOR 循环中设置的 FOR 循环中的环境变量?
【发布时间】:2026-01-13 08:50:01
【问题描述】:

这就是我所拥有的:

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 和另一个B。 %%G 在整个 FOR 命令中设置为英语和数学,并找到文件夹。但是 %grade% 变量由于某种原因没有设置。我不知道为什么。谢谢

【问题讨论】:

    标签: windows variables batch-file for-loop


    【解决方案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=&lt;file 仅读取文件的第一行。 而%%G 只会访问文件的第一个单词。检查标记和分隔符选项。

    【讨论】:

    • 我应该更清楚一点。每个班级都有一个文件夹,其中有一个grade.txt 文件。所以我希望 %grade% 设置为每个班级文件夹的文本文件中的成绩。要查看的类文件夹我想由 classes.txt 文件中的类名确定,然后将类文件夹的路径输入为 %%G 然后 %%H 等等。这样,classes.txt 中的每个班级都会在他们的文件夹中查找grade.txt,然后回显等级。我希望这是有道理的。除非延迟扩张能解决这个问题。但我不知道什么是延迟扩展。对不起,冗长的解释...
    • 我也尝试使用您上面的答案,但它产生了相同的结果。 @npocmaka
    • @TonyStark 举例说明会更容易
    【解决方案2】:

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

    • 学生\name1\class1
    • 。 . . . . . . .\ . . . . . . \class2
    • . . .
    • 学生\name2\class1
    • 。 . . . . . . .\ . . . . . . \class2

    。 . . 并且 classes.txt 在 name 文件夹中,grade.txt 文件在每个 class 文件夹中。


     @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 中获取该单个班级的单个成绩。

    使用“嵌套 for 循环,对于外部循环的每次迭代,所有内部 for 的迭代都会执行。” [@MCND]。因此,例如,如果grade.txt 包含两个班级的成绩,每个班级都在单独的行中,如下所示:
    .一个
    . b
    结果将是:
    . studentame 获得数学成绩
    .学生姓名在数学中得了 b
    . studentame 得到了英文
    . studentname 得到 b 的英文

    【讨论】:

    • 上述答案无效,但您的原始响应完美运行,嵌套 for 循环。再次感谢@sjoy 如果你能把它加回来那就太好了。
    • 好的@TonyStark。回滚到上一个答案。很惊讶 set /p 读取文件的方法不起作用,因为我测试了所有内容,但是很好,这可以满足您的需要。
    【解决方案3】:

    如果您在使用echo 时使用" ",也许您会得到更好的结果?即echo "$VARIBALE"

    【讨论】:

    • 不,这并没有产生更好的结果。我得到的只是You have "" in Math