2017-04-20 85 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实例之一两边,隐式。