Скопируйте все файлы с определенным родительским каталогом, сохраняя при этом дерево каталогов - PullRequest
1 голос
/ 09 апреля 2020

Как я могу рекурсивно скопировать все файлы в структуре каталогов, которые имеют имя папки «Данные» в своем пути, игнорируя при этом все остальные файлы?

Пример:

Исходная структура каталогов

                         a\b\Data\c\d\myfile2.ext
                         a\b\Data\c\e\myfile.ext
                         a\b\f\g\myfile3.ext

Скопированная структура каталогов:

                         a\b\Data\c\d\myfile.ext
                         a\b\Data\c\e\myfile2.ext

Похоже, я должен быть в состоянии сделать что-то вроде: xcopy a * \ Data * destination / s

Но не могу заставить это работать.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Поскольку вы пометили это PowerShell, вы можете сделать это с помощью приведенного ниже кода:

$sourcePath  = 'D:\Test'          # the parent directory
$destination = 'D:\Destination'   # the directory to copy to

Get-ChildItem -Path $sourcePath -Filter * -File -Recurse | 
    Where-Object { ($_.DirectoryName -split '\\') -contains 'Data' } |   # the file's path should include folder "Data"
    ForEach-Object {
        # create the path for the destination including all subfolders
        $targetPath = Join-Path -Path $destination -ChildPath $_.DirectoryName.Substring($sourcePath.Length)
        # if that path does not yet exist create it
        if (!(Test-Path $targetPath -PathType Container)) {
            New-Item -ItemType Directory -Path $targetPath | Out-Null
        }
        $_ | Copy-Item -Destination $targetPath -Force
    }

Исходная структура в родительской папке:

D:\TEST
\---a
    |   sd_fks.pdf
    |
    \---b
        |   sd_fks.pdf
        |
        +---Data
        |   \---c
        |       +---d
        |       |       myFile.ext
        |       |
        |       \---e
        |               myFile2.ext
        |
        \---f
            \---g
                    myFile3.ext

Результат в папке назначения :

D:\DESTINATION
\---a
    \---b
        \---Data
            \---c
                +---d
                |       myFile.ext
                |
                \---e
                        myFile2.ext
0 голосов
/ 09 апреля 2020

Я не уверен, почему вы ссылаетесь на xcopy, но также пометил вопрос как связанный с PowerShell, но, поскольку я знаю, что ответ PowerShell - это ответ PowerShell, который я дам:)

Вы можете использовать командлет Copy-Item с аргументом -Recurse для копирования всего каталога. Вы можете использовать Get-ChildItem (и также recurse, если вы wi sh), чтобы получить структуру каталогов. Это довольно изящный командлет. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...