2017-01-01 23 views

回答

2

通常,遞歸處理文件,我會建議使用for /R loop。但是,在這種情況下,因爲我猜你想將目錄層次結構從源文件複製到目標文件夾,所以我不使用它,因爲它僅解析爲絕對路徑。相反,我使用xcopy /L,它不會複製任何內容(歸因於/L),但會將所有適用的項目列爲相對於源文件夾的路徑;然後繞回for /F loop來閱讀相對路徑列表並解決與目標文件夾相關的問題;在循環體中最後需要放置ffmpeg(根據需要定義選項並在測試之後刪除前面的大寫ECHO; ffmpeg工具不會接收任何相對路徑,但僅對輸入和輸出文件都使用絕對路徑):

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SOURCE=X:\Music\flac\flacfolder" & rem // (absolute source path) 
set "_TARGET=X:\Music\mp3\flacfolder" & rem // (absolute target path) 
set "_PATTERN=*.flac" & rem // (pure file pattern for input files) 
set "_FILEEXT=.mp3" & rem // (pure file extension of output files) 

pushd "%_TARGET%" || exit /B 1 
for /F "delims=" %%F in (' 
    cd /D "%_SOURCE%" ^&^& ^(rem/ list but do not copy:^
     ^& xcopy /L /S /Y /I ".\%_PATTERN%" "%_TARGET%"^
     ^| find ".\" ^& rem/ remove summary line; 
    ^) 
') do (
    2> nul mkdir "%%~dpF." 
    rem // Set up the correct `ffmpeg` command line here: 
    ECHO ffmpeg -i "%_SOURCE%\%%~F" "%%~dpnF%_FILEEXT%" 
) 
popd 

endlocal 
exit /B 

如果你想在一個平面文件夾結構,而不是目標的文件,一個for /R循環workes罰款:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_SOURCE=X:\Music\flac\flacfolder" & rem // (absolute source path) 
set "_TARGET=X:\Music\mp3\flacfolder" & rem // (absolute target path) 
set "_PATTERN=*.flac" & rem // (pure file pattern for input files) 
set "_FILEEXT=.mp3" & rem // (pure file extension of output files) 

for /R "%_SOURCE%" %%F in ("%_PATTERN%") do (
    rem // Set up the correct `ffmpeg` command line here: 
    ECHO ffmpeg -i "%_SOURCE%\%%~F" "%_TARGET%\%%~nF%_FILEEXT%" 
) 

endlocal 
exit /B 
+0

看起來它試圖搜索文件目錄中的文件,所以它找不到它們,例如:'。\ Braid \ 08告訴它由Heart.flac' 而不是'E:\ Music \ Loseless Game Soundtrack \ Braid \ 08告訴它由Heart.flac',但它完美地複製目錄。 此外,它會嘗試轉換.bat,.log和.png文件,但我認爲ffmpeg無論如何都會忽略它們,所以沒關係。 – arielbeje

+0

因此,當您將'_SOURCE'定義爲'E:\ Music \ Loseless Game Soundtracks'時,腳本將找到文件'。\ Braid \ 08 * .flac'。我不知道'ffmpeg',所以我不確定它是否接受這樣的相對路徑,而且我也不知道'\'是否是這個工具的正確路徑分隔符(也許它可能期望'\\'或' /'),所以當腳本找到路徑時; ffmpeg'可能仍然無法找到它們。不過,我將文件模式從'*。*'更正爲'* .flac',同時不再匹配所有文件類型... – aschipfl

+0

有沒有辦法讓它成爲非相對路徑? – arielbeje

1

我有一個我以前用過的例子。我嘗試添加你的結構。

@echo off 
cd X:\Music\flac\flacfolder 

for /F "tokens=1 delims=" %%i IN ('dir /s /b ^| findstr .flac') do (
    call :process_code "%%i" 
) 

goto end 


:process_code 
echo Running conversion for %1 
:: Run your process here 

goto :eof 

:end 

echo done! 

我希望這有助於

+0

它似乎不適用於包含空格的文件名。 – arielbeje

+0

@arielbeje使用'「%%我」'照顧空間。 – DavidPostill

+0

@DavidPostill它會立即崩潰。 – arielbeje

1

試着這麼做:

@echo off 
setlocal 
set FLAC_FOLDER=c:\temp\flacfolder 
set MP3_ROOT_FOLDER=c:\temp\mp3folder 
echo Processing folder [%FLAC_FOLDER%]... 
for /f "tokens=*" %%F in ('dir "%FLAC_FOLDER%\*.flac" /a-d /b') do call :PROCESS_FLAC_FILE "%FLAC_FOLDER%" "%%F" 
goto END 

:PROCESS_FLAC_FILE 
set PFF_FOLDER=%1 
set PFF_FILE=%2 
set PFF_FOLDER=%PFF_FOLDER:"=% 
set PFF_FILE=%PFF_FILE:"=% 
for /f %%I in ("%PFF_FILE%") do set PFF_MP3_FILE=%%~nI.mp3 
echo Processing FLAC file [%PFF_FILE%] in folder [%PFF_FOLDER%]; output file is [%PFF_MP3_FILE%]... 

REM Now call ffmpeg using the approriate variables. Enclose the variables in double-quotes, e.g.: 
REM (note, I don't know the syntax for ffmpeg, so I'm making this up as an example) 

ffmpeg.exe -source "%PFF_FOLDER%\%PFF_FILE%" -target "%MP3_ROOT_FOLDER%\%PFF_MP3_FILE%" 

goto END 

:END 
+0

該腳本重複同一個文件幾次,只輸出兩個文件。我認爲我正確設置了ffmpeg: 'ffmpeg -i「%PFF_FOLDER%\%PFF_FILE%」-ab 320k -map_metadata 0 -id3v2_version 3 -n「%MP3_ROOT_FOLDER%\%PFF_MP3_FILE%」' – arielbeje

相關問題