Хорошо, вот один. Возможно, вы захотите использовать что-то более гибкое, чем командный файл; простая программа на C++ была бы намного проще. Пакетная игра не подходит для манипуляции со строками, необходимой для извлечения имени каталога.
@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
На данный момент ничего не было жестко закодировано: чтобы использовать это, сделайте это.
copyfiles.bat <destination> <source> <ext> [ext]
например
copyfiles.bat "C:\Dest" "C:\Source" .txt .xml .csv .log
РЕДАКТИРОВАТЬ (согласно запросу в первом комментарии)
::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