批处理 - For循环中的重定向问题

时间:2017-03-31 15:00:57

标签: batch-file

我很难获得在For循环中运行的命令。从cmd提示符可以正常工作:

"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.

仅供参考,我找到了一种方法,可以通过以下方式获得我想要的结果: 我可以使用以下代码在Batch中工作,并生成所需的输出:

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

我做错了什么?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 :(得分: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)
)

但是我无法按照find的预期过滤引用的可执行文件名的输出。