2016-12-11 79 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

相關問題