批处理:循环遍历文件夹和子文件夹并将它们放入脚本中

时间:2017-01-01 15:52:09

标签: windows batch-file ffmpeg

我想使用.flacX:\Music\flac\flacfolder\name.flac文件从X:\Music\mp3\flacfolder\name.mp3转换为ffmpeg,但我无法找到如何在将目录传递给其他命令时进行循环并操纵它。

3 个答案:

答案 0 :(得分:3)

通常,为了递归处理文件,我建议使用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循环可以正常工作:

@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

答案 1 :(得分: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!

我希望这会有所帮助

答案 2 :(得分: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
相关问题