【发布时间】:2014-12-23 14:49:06
【问题描述】:
我觉得我在这里搞糊涂了。
我有一个循环运行文件夹中的所有文件
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!
现在我认为这就像在 findstr 循环中重用 %%J 一样简单,但它似乎不起作用。当我运行代码时,它告诉我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
所以外壳如何读取 %%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。所以现在至少它完整地阅读了文件。至少看起来是这样。
【问题讨论】:
-
您需要准确地向我们展示您用于产生失败条件的代码。只需将其编辑到您发布的问题中即可。
-
我的帖子中的代码是唯一与无法正常工作的脚本相关的代码。我已经对其进行了足够的测试,知道它只有这个小部分没有做它的工作(至少它是唯一一个促成这部分没有做它的工作的部分)
标签: batch-file for-loop scope batch-processing findstr