批量解析具有复杂路径的命令的输出

parsing the output of a command with a complex path in batch

我有一个 Windows 8 批处理文件,我试图在其中解析命令的输出以设置变量。如果 set frob=c:\path_to_frob\frob.exe 中的路径不包含空格,则以下工作正常:

for /f "tokens=5" %%i in ('%frob% -l ^| findstr "flux capacitor at "') do (
    if NOT ERRORLEVEL 1 (
        set flux_level=%%i
        set /A flux_level=!flux_level:4,1!
    )
)

但是,如果 frob.exe 位于 set frob=c:\path to frob\frob.exe 那么我得到错误:

'c:\path' is not recognized as an internal or external command, operable program or batch file.

我尝试用 usebackq 修改 for 循环,但我得到了同样的错误:

for /f "usebackq tokens=4" %%i in ('"%frob%" -l ^| findstr "flux capacitor at "') do (

如何让 for /f 解析具有复杂路径的命令的输出?

编辑 1

这个命令:

for /F "tokens=4" %%i in ('"%frob%" -l ^| findstr /C:"flux capacitor at "') do (

扩展为:

for /F "tokens=4" %i in ('"c:\path to frob\frob.exe" -l | findstr /C:"flux capacitor at "') do (
'c:\path' is not recognized as an internal or external command,
operable program or batch file.

编辑 2

我可以通过输入以下内容来验证 %frob% 路径是否正确: "%frob%" --help 就在 for /f 循环之前。它按预期工作并打印应用程序命令行帮助。

编辑 3

如果我的 findstr 字符串更短并且不需要引号,那么我就不会收到该错误。例如,此命令:

for /F "tokens=4" %%i in ('"%frob%" -l ^| findstr flux') do (

没有给我关于 frob 路径的错误。

删除 usebackq 这会改变不同类型引号的含义。

"quotes around the full program path and name" 需要转义 space 分隔符。 'quotes round the command' 用于告诉 for /f 该字符串是要执行的命令。通过使用反引号 (`) 代替单引号,您可能会 using usebackq 得到相同的结果。


这里出了点大问题。

我试过以下方法:

@ECHO OFF
SETLOCAL
SET "frob=u:\sourcedir\another dir\showparams.exe"
for /f "delims=" %%i in ('echo. ^|"%frob%" -l ') do (
 ECHO %%i
)
ECHO ===============
SET "frob=u:\sourcedir\another dir\showparams.exe"
for /f "usebackq delims=" %%i in (`echo. ^|"%frob%" -l `) do (
 ECHO %%i
)
ECHO ===============
FOR %%w IN ("%frob%") DO (
for /f "delims=" %%i in ('echo. ^|%%~dpnxsw -l ') do (
 ECHO %%i
)
)
GOTO :EOF

执行位于包含 spaces 的路径中的程序的三种不同方式。

一切都完美无缺 - 前提是指定为 fob 的文件存在。奇怪的是,如果可执行文件丢失,我收到了与 OP 相同的响应:O

显然我没有 OP 的可执行文件,但该方法对我来说非常有效。我怀疑 frob.

的值有误
for /f "tokens=4" %%i in ('"%frob%" -l ^| findstr /c:"flux capacitor at "') do (
        set "flux_level=%%i"
        set /A "flux_level=!flux_level:4,1!"
)
  • 如果%frob%包含空格,请引用

  • a findstr 搜索内部有空格的字符串的命令需要指示为 /c:"..."

  • 的搜索词
  • in 子句 运行 中的命令在另一个 cmd 实例中执行,错误级别在 do 子句中不可访问。如果什么都没有找到,管道输出中将没有任何行,for 将不会执行 do 子句中的代码。

EDIT 1 - for 命令在单独的 cmd 实例中执行 in 子句中指示的命令。此实例检索、解析并执行命令。在某些情况下,双引号会干扰,首引号和末引号会被删除(有关详细信息,请参阅 cmd /?)并且最终命令是错误的。

for /f "tokens=4" %%i in ('
    " "%frob%" -l | findstr /c:"flux capacitor at " "
') do (
        set "flux_level=%%i"
        set /A "flux_level=!flux_level:4,1!"
)

用双引号引用完整的内部命令并删除管道中的^以处理子shell中的解析问题