2017-03-31 78 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