2017-03-31 73 views
0

我很难获取在For循环中运行的命令。从命令提示符这工作得很好:批处理 - 在For循环内重定向时出现问题

"C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" -r info | find "E:" 

但是,下面好像有语法问题

for /f "tokens=1-7 delims=," %%A in ('"C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" ^-r info ^| find "E:"') do (set _DRVID=%%A) 

屈服的错误 - C:\Program' is not recognized as an internal or external command, operable program or batch file.

仅供参考,我找到了一种方法得到我想要的结果与以下内容: 我可以得到以下代码在批处理以及生成所需的输出:

for /f "tokens=1-7 delims=," %%A in ('"C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" ^-r info') do (IF %%G=="E:" set _DRVID=%%A) 

我在做什么错?

+0

我在代码中看不到任何重定向。 – Squashman

+0

它真的是'^ -r',还是它是一个错字,应该读'-r'?没有必要逃脱' - '... – aschipfl

+0

@Squashman,那管道呢?你不认为如重定向? – aschipfl

回答

1

最好的变通在我看来是把周围的表达一对引号引号:

for /f "tokens=1-7 delims=," %%A in ('^""C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" ^-r info ^| find "E:"^"') do (set "_DRVID=%%~A") 

for /F后消耗封闭'',该cmd实例执行表达式删除外因为剩余的命令行显示为奇数,因此不能执行:

C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" ^-r info ^| find "E: 

额外的一对""固定,但你需要改变逃逸。添加一对转义报价^"^"可让代码正常工作,而无需更改转义。因此这是最一般的解决方案。

2

当管道,管道的两侧都在cmd自己的实例中执行。这使得引用和转义看起来不直观。尝试:

for /f "tokens=1-7 delims=," %%A in ('""C:\Program Files (x86^)\MakeMKV\makemkvcon64.exe" -r info | find "E:""') do (set _DRVID=%%A) 
0

嗯 - 一个小实验后,我得到这个(或我的版本)的工作:

for /f "delims=" %%X in ('"C:\Program Files (x86)\MakeMKV\makemkvcon64.exe" ^-r') do (
for /f "tokens=1-7 delims=," %%A in ('ECHO(%%X^| find "E:"') do (set _DRVID=%%A) 
) 

但我没能得到一个带引号的executablename的输出按照预期由find进行过滤。

+1

你似乎有这个EXE(我没有)。你能否请我测试我的答案(特别是,如果需要转义'-'(我怀疑它)。 – Stephan

+0

@stephan:我在包含括号(这似乎是问题的根源)的路径中使用了一个不同的可执行文件来测试两种解决方案 – Magoo