Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理中使用复杂路径分析命令的输出_Batch File_Windows 8 - Fatal编程技术网

Batch file 批处理中使用复杂路径分析命令的输出

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

我有一个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=!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%
文件不存在。太奇怪了!但是你搞定了。谢谢。