1

我想做的是从包含各种视频文件名的文本文件中过滤掉特定的视频文件扩展名,例如 filename.txt 内容是

Red.mp4
Yellow.mp4
Blue.mp4
Orange.wmv
Purple.wmv

现在我将只为 .mp4 解析这个文件并利用“for parameter”来制作几个.txt 文件,每个文件都包含特定文件的特定代码。换句话说,将创建与 filename.txt 中的 .mp4 视频数量相同的文件数量 我的代码

::==
@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in ('type filename.txt ^|findstr ".mp4"') do (
set /a n+=1
echo >myfile!n!.txt
set v!n!=x264 --crf 23  --level 3.1 --tune film --o "%%a" "%%a.mkv"
)
set v
pause
::==

我有两个问题:

  1. 如何修改%%a 以删除其 .mp4 字符串,因为当我应用“%%a.mkv”时,文件将被命名为 *.mp4.mkv,我不希望这样,并且可以手动键入 .mp4 --o "%%a.mp4" "%%a.mkv"
  2. 如果已经创建了所需的 txt 文件,我如何将变量 v1、v2、v3... 传递给我尝试使用的相应文本文件

    echo %v!n!% > >myfile!n!.txt 循环中,但它不起作用,所以请建议

4

1 回答 1

2

我认为不需要使用一个循环创建一组变量,然后在第二个循环中将内容添加到文件中。只需在一个循环中完成所有操作。

此外,没有必要创建一个空文件,并且您这样做的尝试是不正确的 - 它会将行添加ECHO is off.到每个文件中。要回显空白行,您应该使用>filename ECHO(. 要创建一个空文件,请使用copy nul filename.

这不太可能成为问题,但文件名可能包含!. !如果启用延迟扩展,包含 FOR 变量的扩展将被破坏。该问题可以通过在循环中打开和关闭延迟扩展来解决,但还有另一种解决方案:使用另一个 FINDSTR 命令在每行前面加上行号,然后使用 FOR 循环解析行号和文件名。这消除了增加计数器的需要并消除了延迟扩展的需要。

~nFOR 变量修饰符用于获取不带扩展名的名称。

@echo off
for /f "tokens=1* delims=:" %%A in (
  'findstr /lie ".mp4" filename.txt^|findstr /n "^"'
) do (
  >"myfile%%A.txt" echo x264 --crf 23 --level 3.1 --tune film --o "%%B" "%%~nB.mkv"
)
于 2012-10-23T03:55:44.957 回答