修改For循环变量cmd

时间:2012-10-23 02:41:52

标签: batch-file cmd

我想要做的是从包含各种视频文件名的文本文件中过滤掉特定的视频文件扩展名,例如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可以手动输入,如 - “%% a.mp4”“%% a.mkv”
  2. 如果已创建所需的txt文件,如何将变量v1,v2,v3 ...传递到我尝试过的相应文本文件

    echo%v!n!%> >!MYFILEÑ.TXT 循环中,但它不起作用,所以PLZ建议

1 个答案:

答案 0 :(得分:2)

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

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

这不太可能是一个问题,但文件名可能包含!。如果启用了延迟扩展,则包含!的FOR变量的扩展将被破坏。可以通过在循环内切换延迟扩展来解决此问题,但还有另一种解决方案:使用另一个FINDSTR命令在每行前面添加行号,然后使用FOR循环解析行号和文件名。这消除了增加计数器的需要,并且无需延迟扩展。

~n FOR变量修饰符用于获取没有扩展名的名称。

@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"
)