认为我在这里弄得很困惑。
我有一个循环来运行文件夹中的所有文件
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
。所以现在至少它完整地阅读了这个文件。至少看起来就是这样。
答案 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
)
)