Следующий скрипт - улучшенная версия ответа aflat.
Скрипт ожидает два аргумента: SourcePath TargetPath.
Он рекурсивно копирует все файлы из SourcePath и его подпапок в TargetPath, добавляя увеличивающийся счетчик к базовому имени, только если есть дубликат.
Выдает ошибку, если TargetPath уже существует, поскольку, возможно, уже существуют имена с суффиксом _n.
Необходима дополнительная работа, если вам нужен отдельный счетчик для каждого базового имени и / или если вы хотите иметь возможность копировать в существующую папку.
Сценарий более надежен, чем афлатный ответ. Например, имена с !
работают просто отлично. Он также реализует алгоритм aflat более прямым и эффективным способом.
::copyFlat sourcePath TargetPath
@echo off
setlocal disableDelayedExpansion
:: Initialize and validate arguments
if "%~2" equ "" echo Error: Insufficient arguments>&2&exit /b 1
set "source=%~f1"
if not exist "%source%\" echo Error: Source folder "%source%" does not exist>&2&exit /b 1
set "target=%~f2"
if exist "%target%\" echo Error: Target folder "%target%" already exists>&2&exit /b 1
:: Do the work
md "%target%"
set /a n=0
for /r "%source%" %%F in (*) do if "%%~dpF" neq "%target%\" (
if exist "%target%\%%~nxF" (
set /a n+=1
set "full=%%F"
set "name=%%~nF"
set "ext=%%~xF"
setlocal enableDelayedExpansion
copy "!full!" "!target!\!name!_!n!!ext!" >nul
endlocal
) else copy "%%F" "%target%" >nul
)