您需要将每个源文件的相对路径合并到您的目标中。如果您希望脚本是防弹的,这并非易事。
下面未经测试的代码使用批处理函数来确定字符串的长度。有许多技术可以批量计算字符串长度。
一旦我知道了根源路径的长度,就很容易对源文件的完整路径进行子字符串操作以获得相对路径。
@echo off
setlocal disableDelayedExpansion
REM get absolute path of source and destination roots
for %%F in ("%~1\x") do set "src=%%~dpF"
for %%F in ("%~2\x") do set "dst=%%~dpF"
REM get length of root source path
call :strlen src srcLen
REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T "%src%\." "%dst%\."
REM walk directory structure and convert each file in quiet mode
for /R "%src%" %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
set "file=%%~fF"
set "file2=%%~dpnF"
echo converting "%%~nxF" ...
setlocal enableDelayedExpansion
ffmpeg -v quiet -i "!file!" -vcodec libx264 "!dst!!file2:~%srcLen%!-converted.mp4"
endlocal
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b
:strlen strVar [rtnVar]
setlocal EnableDelayedExpansion
set "s=!%~1!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
(
endlocal
if "%~2" equ "" (echo %len%) else set "%~2=%len%"
exit /b
)
如果您有两个未分配的驱动器号可以映射到您的根源文件夹和目标文件夹,那么有一个非常简单的解决方案。这将允许您使用完整的绝对路径(没有驱动器号)。我假设 X: 和 Y: 可用
@echo off
setlocal disableDelayedExpansion
REM map unused drive letters to source and destination
for %%F in ("%~1\.") do subst x: "%%~fF"
for %%F in ("%~2\.") do subst y: "%%~fF"
REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T x:\ y:\
REM walk directory structure and convert each file in quiet mode
for /R x:\ %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
echo converting "%%~nxF" ...
ffmpeg -v quiet -i "%%F" -vcodec libx264 "y:%%~pnF-converted.mp4"
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b
REM release mapped drive letters
subst /d x:
subst /d y: