批量解析具有复杂路径的命令的输出
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中的解析问题
我有一个 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中的解析问题