Ok, aqui está um. Você pode querer considerar o uso de algo mais flexível que um arquivo em lote; um programa C ++ simples teria sido muito mais fácil. O lote não funciona bem com a manipulação de string necessária para extrair o nome do diretório.
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET _destination=%~1
SHIFT
SET _source=%~1
SHIFT
SET _cmdstring=dir /b /s
:LoopGetExt
SET _cmdstring=%_cmdstring% "%_source%\*%~1"
SHIFT
IF NOT "%~1"=="" GOTO LoopGetExt
::End LoopGetExt
FOR /F "tokens=*" %%i IN ('%_cmdstring%') DO (
SET _fullpath=%%i
SET _splitpath=!_fullpath:\=^
!
SET _filename=%%~ni%%~xi
FOR /F "tokens=*" %%j IN ("!_splitpath!") DO (
IF NOT "%%j"=="!_filename!" SET _dirname=%%j
)
ECHO "%%i" =^> "%_destination%\!_dirname!_!_filename!"
COPY "%%i" "%_destination%\!_dirname!_!_filename!"
)
ENDLOCAL
No momento, nada foi codificado: para usá-lo, faça isso.
copyfiles.bat <destination> <source> <ext> [ext]
por exemplo,
copyfiles.bat "C:\Dest" "C:\Source" .txt .xml .csv .log
EDIT (como por solicitação no primeiro comentário)
::copyfiles.bat <destination> <source> <ext> [ext]
::e.g.
::copyfiles.bat "C:\Dest" "C:\Source" .txt .xml .csv .log
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET _destination=%~1
SHIFT
SET _source=%~1
SHIFT
SET _cmdstring=dir /b /s
:LoopGetExt
SET _cmdstring=%_cmdstring% "%_source%\*%~1"
SHIFT
IF NOT "%~1"=="" GOTO LoopGetExt
::End LoopGetExt
FOR /F "tokens=*" %%i IN ('%_cmdstring%') DO (
SET _fullpath=%%i
SET _splitpath=!_fullpath:\=^
!
SET _filename=%%~ni
FOR /F "tokens=1 delims=. " %%j IN ("!_splitpath!") DO (
IF NOT "%%j"=="!_filename!" SET _dirname=%%j
)
ECHO "%%i" =^> "%_destination%\!_dirname!%%~xi"
COPY "%%i" "%_destination%\!_dirname!%%~xi"
)
ENDLOCAL