我一直在努力通过自动化流程让我的工作变得更轻松。这是我到目前为止所得到的:
@echo off
setlocal EnableDelayedExpansion
for /l %%x in (1,1,10) do (
set /a counter=%%x+1
set output=%%x
start /wait ffmpeg.exe -i "blabla/playlist.m3u8" -c copy C:\teste\%%x.ts
)
pause >nul
blabla/playlist.m3u8
总是在变化(参见下面的文件),我想用增量变量重命名流(链接),这样第一个变为1.ts
,第二个{{ 1}}等等。
假设我的文件(2.ts
)结构如下:
streams.txt
如何解析blabla1/playlist1.m3u8
blabla2/playlist132.m3u8
blabla3/playlist12.m3u8
blabla4/playlist66.m3u8
...
循环中文件中的每一行,并通过递增for
变量重命名流?
//我知道下一个语法:%%x
但我不知道如何在我的情况下实际应用它
答案 0 :(得分:3)
另一种更简单的方法:
@echo off
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" streams.txt') do (
ECHO start /wait ffmpeg.exe -i "%%b" -c copy C:\teste\%%a.ts
)
findstr /N
命令枚举行,因此没有必要为该数字使用另一个变量。输出是:
start /wait ffmpeg.exe -i "blabla1/playlist1.m3u8" -c copy C:\teste\1.ts
start /wait ffmpeg.exe -i "blabla2/playlist132.m3u8" -c copy C:\teste\2.ts
start /wait ffmpeg.exe -i "blabla3/playlist12.m3u8" -c copy C:\teste\3.ts
start /wait ffmpeg.exe -i "blabla4/playlist66.m3u8" -c copy C:\teste\4.ts
编辑:添加新方法作为对评论的回复
@echo off
setlocal EnableDelayedExpansion
< anotherFile.txt (
for /F "delims=" %%a in (streams.txt) do (
set /P "line="
ECHO start /wait ffmpeg.exe -i "%%a" -c copy "C:\teste\!line!.ts"
)
)
输出:
start /wait ffmpeg.exe -i "blabla1/playlist1.m3u8" -c copy "C:\teste\first-line-of another-file.ts"
start /wait ffmpeg.exe -i "blabla2/playlist132.m3u8" -c copy "C:\teste\second-line-of another-file.ts"
start /wait ffmpeg.exe -i "blabla3/playlist12.m3u8" -c copy "C:\teste\third-line-of another-file.ts"
start /wait ffmpeg.exe -i "blabla4/playlist66.m3u8" -c copy "C:\teste\fourth-line-of another-file.ts"
答案 1 :(得分:0)
假设我理解你的目标,这应该有效:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET COUNTER=0
FOR /F "tokens=*" %%G IN ( streams.txt ) DO (
SET /A COUNTER+=1
ECHO START /wait ffmpeg.exe -i "%%G" -c copy C:\teste\!COUNTER!.ts
)
脚本处于非活动状态,即只打印出命令 - 删除ECHO
以激活它。使用示例文件streams.txt
,它会打印:
START /wait ffmpeg.exe -i "blabla1/playlist1.m3u8" -c copy C:\teste\1.ts
START /wait ffmpeg.exe -i "blabla2/playlist132.m3u8" -c copy C:\teste\2.ts
START /wait ffmpeg.exe -i "blabla3/playlist12.m3u8" -c copy C:\teste\3.ts
START /wait ffmpeg.exe -i "blabla4/playlist66.m3u8" -c copy C:\teste\4.ts
答案 2 :(得分:0)
以下是逐行读取文件名所需的代码,并使用递增的数字:
@echo off
setlocal EnableDelayedExpansion
set "Counter=0"
for /F "usebackq delims=" %%L in ("streams.txt") do (
set /A Counter+=1
ffmpeg.exe -i "%%~L" -c copy C:\teste\!Counter!.ts
)
endlocal
pause >nul
ffmpeg.exe
是一个控制台应用程序,因此无需使用start /wait
。
但是如果你想使用命令 start ,你需要一行
start "" /wait ffmpeg.exe -i "%%~L" -c copy C:\teste\!Counter!.ts
阅读this answer,了解在命令开始后经常需要将""
或有意义的标题字符串指定为第一个双引号字符串的原因。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
pause /?
set /?
setlocal /?
!Counter!
而不是%Counter%
来引用具有延迟扩展的环境变量Counter
的当前值。使用%Counter%
... (
定义的块中的)
将导致将此字符串替换为解析整个块上的块上方所定义的0
。在命令提示符窗口中运行if /?
,以获取有关延迟扩展的详细信息,并在一个简单示例中进行说明。
另请参阅Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案为什么应该始终使用双引号以这种方式为变量赋值:set "variable=value"