【问题标题】:How to set a variable in these batch loops?如何在这些批处理循环中设置变量?
【发布时间】: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


【解决方案1】:
for %%J in ( ... ) do  (
    ....
    %%J is visible here, inside the do clause
    ....
) <- here %%J goes out of scope

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

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
    )
)

【讨论】:

  • 您能解释一下为什么将/Wait program -r %%J 更改为/Wait program -r "%%~fJ" 吗?
  • FOR变量引用替换。 ~f%%J 扩展为其完全限定路径。在控制台中输入 help for 并查看最后几页以了解此类语法的完整说明。
  • 此语法在第二个循环中无法正确读取 %%J。我对我的原始帖子进行了编辑以显示正在发生的事情。
  • 这是因为%%~nJ 只包含%%J 的基本名称,没有扩展名。如果您想包含扩展名(是的,您确实想要这个),请使用%%~nxJ。或者更好的是,使用%%~fJ 指定完全限定路径。没有理由不这样做。另外,你应该把do (放在上一行,就像MC ND的例子一样。
  • 我又试了一次,由于某种原因它起作用了。上次%%~fJ 实际上是在 shell 之外打开程序
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2016-07-02
  • 2023-03-06
相关资源
最近更新 更多