逐行解析文件并在Batch中为for循环增加变量

时间:2016-01-06 17:44:20

标签: loops batch-file

我一直在努力通过自动化流程让我的工作变得更轻松。这是我到目前为止所得到的:

@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但我不知道如何在我的情况下实际应用它

3 个答案:

答案 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"