2017-04-20 44 views
0

我想並行處理下載實時流的命令。 因此,如果它有4個部分,並且PARTS變量包含數字4,它應該打開4個新的cmd窗口並處理單個部分。使用管道命令進行並行處理

閱讀了很多關於我來到了以下解決方案並行處理後:

set /p URL=Enter video URL: 
set /p NAME=Enter video name: 
set /p PARTS=Enter Number of Parts: 

for /l %%x in (1, 1, %PARTS%) do (
    start cmd /C "C:\Program Files (x86)\Streamlink\bin\streamlink.exe" -O "%URL%/%%x" best | ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "%NAME%p%%x.mp4" 
) 

似乎有與|命令的問題雖然因爲這個腳本會打開啓動和輸出後隨即關閉窗口的管道命令ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "%NAME%p%%x.mp4將顯示在執行腳本的初始cmd窗口中。

如何更改它,以便在新窗口中執行整個命令?

+2

在整個命令行周圍放入另一對引號來執行:'start cmd/C「」C:\ Program Files(x86)\ Streamlink \ bin \ streamlink.exe「-O」%URL%/ %% x「best | ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc」%NAME%p %% x.mp4「」' – Stephan

+0

這會拋出''\ Streamlink \ bin \ streamlink。 exe「在這一點上不能被語法處理。' – maddo7

+2

對不起 - 關閉'''':start cmd/C」「C:\ Program Files(x86 ^)\ Streamlink \ bin \ streamlink.exe」-O「 %URL%/ %% x「最佳| ffmpeg -y -i管道:0 -c:v複製-c:複製-absf aac_adtstoasc」%NAME%p %% x.mp4「」' – Stephan

回答

2

不讓管過程中start命令的輸出,你需要逃避它:

start "" cmd /C "C:\Program Files (x86)\Streamlink\bin\streamlink.exe" -O "%URL%/%%x" best ^| ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "%NAME%p%%x.mp4" 

由於報價沒有被修改這種方式,所使用的路徑和所有可變的部分仍然會出現報價給主叫cmd實例太多,所以沒有更多的額外的轉義是必需的,除非這些字符串可能包含自己的引號,在這種情況下,我強烈建議delayed expansion

setlocal EnableDelayedExpansion 

rem // some other code... 

set /P URL="Enter video URL: " 
set /P NAME="Enter video name: " 

rem // some other code... 

start "" cmd /C "C:\Program Files (x86)\Streamlink\bin\streamlink.exe" -O "!URL!/%%x" best ^| ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "!NAME!p%%x.mp4" 

rem // some other code... 

endlocal 

start後面的""應該聲明爲提供窗口標題;否則可能會出現錯誤,因爲第一個引用的項目被視爲標題而不是命令行的一部分。

上述行仍然可能會導致問題,因爲執行實際命令的cmd實例接收已擴展的值而不是變量。所以,你甚至可能需要這樣做:

rem // Supposing delayed expansion is disabled in the hosting `cmd` instance: 
start "" cmd /C /V "C:\Program Files (x86)\Streamlink\bin\streamlink.exe" -O "!URL!/%%x" best ^| ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "!NAME!p%%x.mp4" 

setlocal EnableDelayedExpansion 

rem // Supposing delayed expansion is enabled in the hosting `cmd` instance: 
start "" cmd /C /V "C:\Program Files (x86)\Streamlink\bin\streamlink.exe" -O "^!URL^!/%%x" best ^| ffmpeg -y -i pipe:0 -c:v copy -c:a copy -absf aac_adtstoasc "^!NAME^!p%%x.mp4" 

endlocal 

注意管道|創建兩個以上cmd實例之一兩邊,隱式。