批处理循环无法设置变量

13
我有一个批处理脚本,试图从 anthill 中执行以获取包含要编译的 plsql 的文件夹名称。
for /F %%a in ('dir /b D:\AHP_WorkDir\var\jobs\projects\rprt_test\rprt_test\plsql') do (
  set FOLDER=%%a
  echo *** PROCESSING FOLDER %FOLDER% ***
)

这似乎没有设置变量,我非常确定在验证后这是正确的,会输出:

* 处理文件夹 *

那么...我做错了什么?


提示:搜索“ENABLEDELAYEDEXPANSION” - adarshr
2
有很多非常多的现有问题处理这个相同的问题,它们都有一个类似的答案。答案可以在帮助系统中找到 - 从命令行键入 HELP FORFOR /?。提示 - 查找关于延迟扩展的讨论。 - dbenham
@dbenham - :-) 你说得太对了!如果我每次回答这种问题只能得到一分钱的话... - jeb
是的,我已经阅读了它们并尝试启用延迟扩展,但没有得到结果,所以我排除了它,很抱歉浪费了您的时间。 - Denis DuQuaine
糟糕,我的错。相关帮助在HELP SET下,而不是HELP FOR下。如果我之前的评论显得苛刻,那我很抱歉。显然许多人很难自己找到答案,否则这个问题就不会如此普遍!但我认为这更反映了批处理的深奥性和缺乏良好文档的特点。对于我们这些经常在这个论坛上提供答案的人来说,这变得令人厌倦。 - dbenham
1个回答

31

这基本上是一个重复的问题,与今天早些时候提出的问题相同。以下是我从那个问题中得到的答案...

您需要查看批处理文件的EnableDelayedExpansion选项。根据上述链接:

当使用FOR循环工作时,延迟变量扩展通常很有用。通常,即使FOR循环跨越批处理脚本的多行,整个FOR循环也会被视为单个命令。

因此,您的脚本最终会像这样:

@echo off
setlocal enabledelayedexpansion

for /F %%a in ('dir /b D:\AHP_WorkDir\var\jobs\projects\rprt_test\rprt_test\plsql') do (
  set FOLDER=%%a
  echo *** PROCESSING FOLDER !FOLDER! ***
)
作为一种替代方案,只需在内部循环中使用%%a变量,而不是创建一个新的变量。

1
谢谢Jonah!我想这个方法有效。在我第一次尝试使用enabledelayedexpansion时,我没有关闭echo...因为我试图回显值以查看它是否设置了,啊我们奔跑的圆圈! - Denis DuQuaine
很高兴能帮忙!如果有帮助,请不要忘记将答案标记为已接受。这样,以后访问此问题的人也可以从您的经验中受益。 - Jonah Bishop
在!变量名!感叹号语法上要特别强调。 - E.S.
备选方案是批处理函数:https://dev59.com/o2Yr5IYBdhLWcg3wRoSW#13809834 - Noumenon
@Jonah Bishop - 你能告诉我“setlocal enabledelayedexpansion”是每个批处理脚本只需要一次还是每个for循环都需要吗?我在我的批处理文件中有多个for循环,其中只有四个循环之一没有传递我收集的值。我没有研究这个问题,只是因为你的帖子帮助我看到我可能需要稍微改变我的脚本。然而,知道答案仍然很有帮助。 - RadFox
setlocal 指令将一直有效,直到脚本找到 endlocal 指令或脚本结束。因此,实质上,在脚本顶部只需要一个即可。 - Jonah Bishop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接