Пакетный скрипт для копирования / удаления папок, соответствующих определенному имени и сохранения их дерева каталогов


Мне интересно, можно ли написать пакетный скрипт для CMD.EXE (целевая система: MS Windows 2k3) для выполнения следующих действий:

Пусть у нас есть папка rootfolder, содержащая множество файлов и каталогов. Некоторые из подкаталогов (на разных уровнях) могут называться dirname. Я хотел бы создать папку rootfolder2, копирующую структуру дерева каталогов rootfolder, но содержащую только папки dirname с их содержимым. Я также хотел бы удалить те же папки после их наличия скопировано в rootfolder2

Пример:

rootfolder
 `- dir1
 `- dir2
     `- filew
     `- dirname
         `- filey
 `- dirname
     `- file1
     `- dirx
         `- file2
 `- filez

И выход, который я ищу, будет:

rootfolder
 `- dir1
 `- dir2
     `- filew
 `- filez

rootfolder2
 `- dir2
     `- dirname
         `- filey
 `- dirname
     `- file1
     `- dirx
         `- file2

Могу ли я сделать это без необходимости писать консольное приложение на C/C++/Java/etc.

Заранее спасибо, Джо


Вот ответ на мой вопрос, используя просто xcopy и пакетный сценарий:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set StartDir=Folder1
set BackupDir=Folder1 BK
mkdir "%BackupDir%"
call :ProcessDir "%StartDir%"
exit /b 0
:ProcessDir
    echo Processing directory "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do (
        if "%%d"=="foldername" ( 
            xcopy /s /e /i "%~1%%d" "%BackupDir%%~1%%d" 
            rmdir /S /Q "%~1%%d"   
        ) else ( 
            call :ProcessDir "%~1%%~d"
        )
    )
    exit /b 0

Кредиты идут на: рекурсивное переименование имен файлов + имен папок с помощью пакетного файла

1 2

1 ответ:

Вот ответ на мой вопрос, используя просто xcopy и batch описание:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set StartDir=Folder1
set BackupDir=Folder1 BK
mkdir "%BackupDir%"
call :ProcessDir "%StartDir%"
exit /b 0
:ProcessDir
    echo Processing directory "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do (
        if "%%d"=="foldername" ( 
            xcopy /s /e /i "%~1\%%d" "%BackupDir%\%~1\%%d" 
            rmdir /S /Q "%~1\%%d"   
        ) else ( 
            call :ProcessDir "%~1\%%~d"
        )
    )
    exit /b 0

Кредиты идут на: рекурсивное переименование имен файлов + имен папок с помощью пакетного файла

Вот так все и делается!