2016-12-11 208 views
2

我正在使用mkvmerge从多个文件中提取音频。这样做时,我想重新命名提取的文件,以便稍后将它们合并起来更方便。如何在批处理命令中同时使用FOR工作2个变量?

我的命令,现在是这样的

for /f "delims=" %%A IN ('dir /b *.mkv') DO mkvextract tracks "%%A" 2:F:\%%~nA.ogg 

从文件中提取音频说“x1.mkv”到“x1.ogg”

我想要做的是,重命名音频将文件(x1.ogg)复制到另一个文件夹中的另一个文件的名称。 有点像这个命令(我知道错了,我想告诉我想达到的目标):

for /f "delims=" %%A IN ('dir /b *.mkv') && %%B in ('dir "F:\Show" /b *.mkv') DO mkvextract tracks "%%A" 2:F:\%%~nB.ogg 

从我的当前目录中取得一个文件(%% A),但提取的音频将在另一个目录(%% B)中具有相应文件的名称。

因此,

x1.mkv => y1.ogg

x2.mkv => y2.ogg等..

那么,如何FOR命令键入,其中2变量具有2个不同目录的文件的名称?

谢谢!

+0

姓名格式总是x和y后跟一个数字?这些文件夹中的文件数量是否相同? –

+0

没有不完全相同的格式..名称不同,但文件数量完全相同。 –

+2

你怎么知道如何配对不同的名字?无关紧要(随机)?按字母顺序排序?按日期排序?每个名称中的通用元素? – dbenham

回答

1
@ECHO OFF 
SETLOCAL 
SET "destdir=U:\destdir" 
FOR /f "tokens=1*delims=:" %%A IN (
'dir /b /a-d "*.mkv"^|findstr /n /r "." ' 
) DO (
FOR /f "tokens=1*delims=:" %%D IN (
    'dir /b /a-d "%destdir%\*.mkv"^|findstr /n /r "." ' 
) DO IF %%A==%%D echo(mkvextract tracks "%%B" 2:F:\%%~nE.ogg 
) 

GOTO :EOF 

您需要更改设置destdir以适合您的情况。

为了测试目的,所需的命令仅仅是ECHO确认命令正确后,请删除字符串ECHO(,该字符串出现在命令之前,以便实际执行命令。

“过滤”包含任何字符的目录列表中的任何行,并在前面的#:处编号。这具有简单生成相同列表的效果,但在前面编号为#:

Tokenise各行成%%A%%B使用分离:所以数量变为%%A和文件名%%B

对于每个%%A,%%B,对另一个目录执行相同的技巧,这次产生%%D,%%E,那么如果行号匹配,请使用变量中适当选择的元素执行命令。

+0

谢谢!有效!不幸的是,我无法理解这些。原谅我,如果它很愚蠢!首先,**设置'sourcedir'意味着什么?你的意思是'destdir'(因为我在代码中没有看到任何sourcedir)。其次,“**数字与前面的#:**”你的意思是把我的所有文件都重命名为“1:”“2:”“3:”等在源和目录中吗? (我没有这样做,但仍然有效)。我也不明白最后一段:( –

+0

是 - 'destdir'(固定)。“dir | findstr/n/r”。“'会产生'dir'行,正如您所知道的那样,但是带有前缀的数字像'x1.mkv'将会变成'3:x1.mkv',你已经知道'/ b'对'dir'有什么作用;'/ ad'表示“no directorynames”。输出到下一个'。'findstr'上的'/ n'表示'对所选行进行编号';'/ r“。''表示'选择包含任何字符的行'。 cmd'表示管道'|'是要执行的命令的一部分,而不是控制执行的'for' – Magoo

+0

外循环对'3:x1.mkv'进行标记,以便将'3'分配给'%% A'和'x1.mkv'到'%% B'。内循环只是作用于另一个目录,将行号赋给'%% D'并将其命名为'%% E'。如果%% A = %%那么我们在'%% B'中有第一个目录的第三行,在'%% E'中有第二个第二行 - 这是所需的匹配。'%% A'将r un从1到目录列表中的行数,仅对于第二个目录列表中的匹配行号,'%% A'将等于'%% D'。因此,所有需要做的是选择完整的文件名'%% B'和''%% E'的名称来处理 – Magoo

相关问题