首页 > 解决方案 > Win Batch 嵌套返回“意外”错误

问题描述

Win10,命令。

编写一个冗长而复杂的脚本,并遇到一个不想合作的部分。这是一个说明问题的片段:

set TESTSTR="abc def ghi jkl mno pqr stu vwx yz"
for /l %%a in (1,1,9) do (
    set I=%%a
    for /f "tokens=!I!" %%b in ("%TESTSTR%") do echo %%b
)

预期的结果是

abc
def
ghi
jkl
mno
pqr
stu
vwx
yz

但我只得到了这个的 9 倍:

!I!" was unexpected at this time.

我已经尝试了多种变体,包括 set VAR="tokens=%%a" - for /f !VAR! ...我在其中卡住了各种回声,发现变量 %%a 正在正确递增,并且我尝试使用的任何中间变量都被正确设置。

它似乎无法在另一个循环的选项部分使用延迟扩展或循环变量。我已经完成了类似的预循环选项定义,它们通常工作得很好,但从未在嵌套的 for 中尝试过,使用外部循环的变量作为内部循环的参数,就像这样。

示例:此代码片段有效,仅显示名为“Update??”的目录 在当前目录中(是的,我知道这比需要的要多,我只是抓住它并将其重新用于此演示 - 原始代码有一个集合而不是 echo,目的是获取最新的目录):

    set FORPARM="usebackq tokens=1"
    for /f %FORPARM% %%f in (`dir /b /a:d /o:d Update??`) do echo %%f

此示例不在 for 或其他需要延迟扩展的情况下,我认为这会导致上面的问题代码出现问题 - for 命令似乎无法处理延迟扩展或作为其一部分的变量命令。

我想我可以通过调用来做到这一点,将第一个 for 的 var 作为调用的参数,并且调用具有内部 for,但不希望 - 我从中提取的例程已经足够复杂 - 它读取数据文件并填充多个数组。我有一个可以工作的例程的变体,但它非常笨拙并且需要在数据文件中的数组数量发生变化时进行编辑。我正在尝试加快速度,使其更整洁,并且在数据更改时不需要更改代码。

还有其他人见过并通过这个吗?

标签: for-loopbatch-fileindexingnesteddelay

解决方案


我真的不认为这是答案,但它是一个答案,基于我试图避免的(和@OJBakker 的答案)。把它放在这里而不是评论,因为评论只是修改了代码部分——我可能只是不知道我在那里做什么......)

代码如下:

:nested_for_test
    set TESTSTR=abc def ghi jkl mno pqr stu vwx yz
    for /l %%a in (1,1,9) do (
        call :nested_for_test_inner %%a
    )
    exit /b
:nested_for_test_inner
    for /f "tokens=%1" %%b in ("%TESTSTR%") do (
        echo %%b
    )
    exit /b

是的,我知道“do”部分不需要括起来——它们是这样的,因为“真正的”代码不仅仅是每个 do 中的一行......

结果如预期:

Start:  8:28:05.98
abc
def
ghi
jkl
mno
pqr
stu
vwx
yz
Start:  8:28:05.98
Stop:  8:28:07.76
Elapsed: 1.78 seconds

是的,我的测试文件中有一个计时器例程。这显示比我希望的要慢,但在合理范围内,考虑到额外的电话。

如果有人知道如何在没有那个电话的情况下做到这一点,请添加!


推荐阅读