如何在这些批处理循环中设置变量?

时间:2014-12-23 14:49:07

标签: batch-file for-loop scope batch-processing findstr

认为我在这里弄得很困惑。

我有一个循环来运行文件夹中的所有文件

for /f "delims=_" %%J in ('forfiles /p "%%F" /m *.ext /c "cmd /c echo @path"')
    do start "program"  /D "c:\program files\path\to\program" /Wait program -r  %%J

%%J应代表每个文件,如果我已正确设置/解释它。

我有另一个循环,它在每个文件的xml代码中查找并使用findstr搜索特定模式并从某些标记中解析出这样的名称:

for /f "tokens=3 delims=<>" %%a in ('findstr /n /i "<Name>ABCDir" "%%J"')
    do (set name=%%a)
echo !name!

现在我认为这就像在%%J循环中重用findstr一样简单,但它似乎没有用。当我运行代码时,它会告诉我FINDSTR: Cannot open %J然后ECHO is off

我猜我的问题是,在下一个循环中尝试使用%%J并且shell没有连接循环之间的点是太快和容易了。

我有什么想法可以做到这一点?因为我需要findstr循环中的文件名始终匹配第一个循环中的文件。

编辑:以下是文件的外观。

c:\path\to\the file name 

这是输出的样子:

FINDSTR: Cannot open "c:\path\
FINDSTR: Cannot open to\
FINDSTR: Cannot open the
FINDSTR: Cannot open file
FINDSTR: Cannot open name

所以看起来这是一个关于shell如何读取%% J变量的简单问题。当我忘记在文件名前加上引号但引号大约是%% J时,就出现了这种类型的东西。我甚至试过双引号,但是当它没有解决它时有点松了一口气。

EDIT2:我改变了

for /f "tokens=3 delims=<>" %%a in ('findstr /n /i "<Name>ABCDir" "%%J"')
    do (set name=%%a)

for /f "tokens=3 delims=<>" %%a in ('findstr /n /i "<Name>ABCDir" "%%~nJ"')
    do (set name=%%a)

现在输出为:FINDSTR: Cannot open the file name。所以现在至少它完整地阅读了这个文件。至少看起来就是这样。

1 个答案:

答案 0 :(得分:3)

for %%J in ( ... ) do  (
    ....
    %%J is visible here, inside the do clause
    ....
) <- here %%J goes out of scope

那么,您可以在第一个%%F子句中包含第二个(第三个:for?)do循环

for %%J in ("%%F\*.ext") do (
    start "program"  /D "c:\program files\path\to\program" /Wait program -r  "%%~fJ"
    for /f "tokens=3 delims=<>" %%a in ('findstr /n /i "<Name>ABCDir" "%%J"') do (
        echo %%a
    )
)