@echo off
setlocal
rem Set target and destination paths.
set "target=%cd%\sourceFolder"
set "dest=%cd%\destinationFolder"
rem Make dest dir if needed.
if not exist "%dest%" md "%dest%"
rem Recurse target and get filepath of .bin files.
for /r "%target%" %%A in (*.bin) do call :moveToDest %%A
exit /b
:moveToDest
setlocal
set "oldname=%~1"
rem Remove target from the filepath.
call set "newname=%%oldname:%target%=%%"
if not defined newname (
>&2 echo target is undefined
exit /b 1
)
rem Remove leading \.
if "%newname:~,1%" == "\" set "newname=%newname:~1%"
rem Replace \ with -.
set "newname=%newname:\=-%"
rem Copy new named file to dest.
copy "%oldname%" "%dest%\%newname%" >nul
if errorlevel 1 (
>&2 echo Failed to copy "%oldname%" to "%dest%\%newname%"
exit /b 1
)
exit /b
Установите target
и dest
перед выполнением.
Поскольку файлы назначения переименовываются и копируются в место назначения без структуры подпапок, создание папки назначения выполняется в начале только один раз.
Целевая папка рекурсируется циклом for
и получает все полные пути к файлам .bin
.Метка :moveToDest
вызывается с аргументом полного пути к каждому .bin
файлу.
В метке :moveToDest
переданный аргумент имеет значение oldname
.Целевой путь удаляется и, если необходимо, приводит к появлению обратной косой черты.Это устанавливает oldname как относительный путь от целевого пути.Обратная косая черта заменяется тире, чтобы создать имя файла для копирования.Копирует файл .bin
, используя copy
, чтобы скопировать из цели в место назначения с новым именем файла.