Использование powershell для синхронизации файлов из одного каталога в каталог с похожим именем, но с другой структурой dir - PullRequest
0 голосов
/ 27 сентября 2018

Итак, у меня есть два отдельных сервера, и мне нужно синхронизировать каталоги с одинаковыми именами, НО находятся в другой структуре каталогов.

Например, один сервер это \\calafs01\GFX_Drop\x\*

xлюбой каталог в GFX_Drop, и я хочу скопировать все его подпапки и их содержимое (только модификации и только новые файлы)

другой сервер \\calamedia\edit\y\x\*

у является организационнымкатегория, которую используют наши пользователи.

Мне нужно скопировать все, что попадает в x на calafs01, в calamedia, однако из-за этого это очень усложняет.

Я могу достаточно легко создать массив свсе значения x:

$Projects = Get-ChildItem \\calafs01\GFX_Drop | %{$_.name} 

, но проблема заключается в том, что сценарий находит каталог x в любом каталоге y, в котором он находится на calamedia, для копирования.

Предполагая использовать робокопию, как только я смогу выяснить, как это сделать ...

Заранее спасибо

РЕДАКТИРОВАТЬ за ответ NAS:

Так что я туп и понял, что есть еще один каталог ПОСЛЕ x в calamedia, но он ВСЕГДА называется GFX, поэтому путь назначения на самом деле \\calamedia\edit\y\x\GFX\*

Предполагается, что это будет простое добавление ...поэтому взял ваш сценарий и сделал это:

$get_y = Get-ChildItem -Directory -Path \\calamedia\edit | Get-ChildItem -Directory     # get all dirs one level deeper

    Get-ChildItem -Directory -Path \\calafs01\GFX_Drop\ | ForEach-Object {              # get all folders 'x'
        $dest_y = $get_y | Where-Object -Property Name -eq $_.Name       # match folder names
        if ($dest_y) {
            Copy-Item -Path $_.FullName -Recurse -Destination "$dest_y.Parent.FullName/GFX" -Force -WhatIf
            # or robocopy if you need to copy modified/new files only
        }
    }

По сути, просто добавил /GFX в конец $dest_y.Parent.FullName (с кавычками), полагал, что это будет работать, но теперь он срабатывает в пункте назначения,Есть ли у меня синтаксическая ошибка при расширении каталога?

РЕДАКТИРОВАТЬ 2:

Понял.

PS C:\Users\chris.slagel> $get_y = Get-ChildItem -Directory -Path \\calamedia\edit | Get-ChildItem -Directory     # get all dirs one level deeper

Get-ChildItem -Directory -Path \\calafs01\GFX_Drop\ | ForEach-Object {              # get all folders 'x'
    $dest_y = $get_y | Where-Object -Property Name -eq $_.Name       # match folder names
    if ($dest_y) {
        Copy-Item -Path $_.FullName -Recurse -Destination "$($dest_y.Parent.FullName)\GFX" -Force -WhatIf
        # or robocopy if you need to copy modified/new files only
    }
}
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test Destination: \\calamedia\edit\Theatrical\GFX".
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test - Copy Destination: \\calamedia\edit\Gaming\GFX".
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test - Copy (2) Destination: \\calamedia\edit\Home Entertainment\GFX".
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test - Copy (3) Destination: \\calamedia\edit\Home Entertainment\GFX".
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test - Copy (4) Destination: \\calamedia\edit\TV & Streaming\GFX".
What if: Performing the operation "Copy Directory" on target "Item: \\calafs01\GFX_Drop\This Is A Test - Copy (5) Destination: \\calamedia\edit\VR\GFX".

Похоже, что он правильно находит папки категорий, но в нем отсутствует часть x (имена проектов, в данном случае все папки "Это тест")

Напримерпервый пункт назначения должен быть \\calamedia\edit\Theatrical\This Is A Test\GFX

1 Ответ

0 голосов
/ 28 сентября 2018
$get_y = Get-ChildItem -Directory -Path \\calamedia\ | Get-ChildItem -Directory     # get all dirs one level deeper

Get-ChildItem -Directory -Path \\calafs01\GFX_Drop\ | ForEach-Object {              # get all folders 'x'
    $dest_y = $get_y | Where-Object -Property Name -eq $_.Name       # match folder names
    if ($dest_y) {
        Copy-Item -Path $_.FullName -Recurse -Destination $dest_y.Parent.FullName -Force -WhatIf
        # or robocopy if you need to copy modified/new files only
    }
}
...