Batch file 批处理中使用复杂路径分析命令的输出
我有一个Windows8批处理文件,试图解析命令的输出以设置变量。如果Batch file 批处理中使用复杂路径分析命令的输出,batch-file,windows-8,Batch File,Windows 8,我有一个Windows8批处理文件,试图解析命令的输出以设置变量。如果set frob=c:\path\u to\u 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=!flu
set frob=c:\path\u to\u 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'不能识别为内部或外部命令、可操作程序或批处理文件。
我曾尝试使用usebackq
修改for循环,但得到了相同的错误:
for /f "usebackq tokens=4" %%i in ('"%frob%" -l ^| findstr "flux capacitor at "') do (
如何让/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%”——帮助
就在/f
循环的之前。它按预期工作,并打印应用程序命令行帮助
编辑3
如果我的findstr
字符串较短并且不需要引号,那么我不会得到该错误。例如,此命令:
for /F "tokens=4" %%i in ('"%frob%" -l ^| findstr /C:"flux capacitor at "') do (
for/F“tokens=4”%%i in(“%frob%”-l^ | findstr flux”)do(
没有告诉我关于frob路径的错误。删除usebackq
,它会更改不同类型引号的含义
完整程序路径和名称周围的“引号”
是转义空格分隔符所必需的。“命令周围的引号”
用于告诉for/f
字符串是要执行的命令。使用反勾(`)使用usebackq
可能会得到相同的结果代替单引号
这里出了点大问题
我尝试了以下方法:
@ECHO关闭
SETLOCAL
设置“frob=u:\sourcedir\other dir\showparams.exe”
对于/f“delims=“%%i in('echo.^ |%frob%”-l'),请执行以下操作:(
回声%%i
)
回音===============
设置“frob=u:\sourcedir\other dir\showparams.exe”
对于/f“usebackq delims=“%%i in(`echo.^ |%frob%”-l`)do(
回声%%i
)
回音===============
对于%%w英寸(“%frob%”),请执行以下操作(
对于/f“delims=“%%i in('echo.^ |%%dpnxsw-l'),请执行以下操作(
回声%%i
)
)
后藤:EOF
执行位于包含空格的路径中的程序的三种不同方式
如果指定为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%
包含空格,请将其引用
- 用于搜索包含空格的字符串的
findstr
命令需要用/c:“…”
- 在
in
子句中执行的命令在另一个cmd
实例中运行,并且在do
子句中无法访问errorlevel。如果未找到任何内容,则管道输出中将没有任何行,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中的解析问题好的,我尝试了for/f“tokens=4”%%I in(
%frob%”-l^ | findstr“flux capactor at”)do(
并且我得到错误系统找不到文件
“c:\path to frob\frob.exe”.`我已经应用了这些更改,但我仍然得到了原始错误。不过,我很欣赏关于错误级别的提示。@PaulH,其中哪一个?未识别的一个或找不到文件的一个?'c:\path'未识别为内部或外部命令、可操作程序或批处理文件。
@PaulH,如果所有OTE(单和双)在正确的位置,我看到的唯一获得此错误的方法是,如果%frob%
文件不存在。太奇怪了!但是你搞定了。谢谢。