如何将 Windows FOR 命令嵌套在另一个 FOR 命令的“集合”中?

如何将 Windows FOR 命令嵌套在另一个 FOR 命令的“集合”中?

我有一个配置文件目录。如果文件包含“STATE = 3”条目,我想提取 TCPHOST 条目的值和文件的名称。其中有很多嵌套的引号,所以我使用了“usebackq”,但没有成功:

c:\config>For /F "usebackq tokens=1,3 delims==: " %A in (`FOR /F "tokens=1 delims= " %P IN ('FINDSTR /M /I /R /C:"*STATE.*=.*3" * ') DO ('FINDSTR /I /S /C:"TCPHOST" %P')`) do (echo '%A|http://%B')

`) was unexpected at this time.

我用简单的“DIR”替换了内部的“FOR”命令,结果在技术上是正确的(尽管毫无意义) - 我显示了输出的第一个和第三个标记。

我是否试图用这些命令做一些不可能的事情。 (我知道我可能可以编写一个 bat 文件或 PowerShell 脚本,但这不是我的问题。)

答案1

我能够得到(我猜)你想要的结果,坚持使用 CMD,但是将你的怪物命令分解为多个步骤,并使用一个中间文件:

copy/y nul %temp%\out1.txt
FOR /F "tokens=1 delims= " %P IN ('FINDSTR /M /I /R /C:"STATE.*=.*3" * ') DO (FINDSTR /I /S /C:"TCPHOST" %P) >> %temp%\out1.txt
For /F "tokens=1,3 delims==: " %A in (%temp%\out1.txt) do (echo '%A^|http://%B')
del %temp%\out1.txt

我无法弄清楚您为什么会得到这个错误,但是您的代码中可能存在以下几个问题:

  • "*STATE.*=.*3"应该是"STATE.*=.*3"(或者可能是".*STATE.*=.*3"),因为以 开头的正则表达式*是无效的。
  • DO ('FINDSTR /I /S /C:"TCPHOST" %P')应该是DO (FINDSTR /I /S /C:"TCPHOST" %P)— 后面的命令DO不应该用引号引起来。
  • echo '%A|http://%B'应该是echo '%A^|http://%B' (为了得到一个字面意思|而不是尝试通过管道传输echo '%Ahttp://%B'或者可能echo %A^|http://%B (以避免在输出中出现单引号 — — 或者您想要它们吗?)。

相关内容