Организация файлов с помощью пакетного скрипта - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно как-то скопировать все файлы из исходной папки (включая подпапки) в папку назначения, сохраняя имя подпапок в качестве имени файла.

Использование пакетного файла в Windows.

Пример:

sourceFolder\packed1.bin
sourceFolder\data1\packed1.bin
sourceFolder\data1\packed2.bin
sourceFolder\data1\zz\packed1.bin
sourceFolder\data1\aa\packed1.bin
sourceFolder\data1\aa\22\packed1.bin

должно стать ...

destinationFolder\packed1.bin
destinationFolder\data1-packed1.bin
destinationFolder\data1-packed2.bin
destinationFolder\data1-zz-packed1.bin
destinationFolder\data1-aa-packed1.bin
destinationFolder\data1-aa-22-packed1.bin

Я пытался использовать goto, но не могу отследить, в каком каталоге я нахожусь, а затем вернуться к нему.

@echo off
setlocal EnableDelayedExpansion

set mypath=%cd%
set "_orig=%mypath%\datafolder"
set "_origCurr=%_orig%"
set "_dest=%mypath%\untree\"

set procDirs
set /a procDirsL=0
set currDirS=""
set /a isProc=0

:gofolders
for /d %%D in ("%_dest%\*.*") do (
set currDirS=%currDirS%\%%D
set procDirs[!procDirsL!]

set /a procDirsL=!procDirsL!+1


goto gofolders
)

:dofiles
for /f %%F in ("%_dest%\*.*") do (

)
goto gofolders

1 Ответ

0 голосов
/ 11 октября 2018
@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, чтобы скопировать из цели в место назначения с новым именем файла.

...