Сценарій Powershell для порівняння 2 папок та копіювання тих же елементів у іншій папці


0

Я новачок у powerhell після вивчення деяких навчальних посібників, я створив код для моєї вимоги. Але вихід був не таким, як очікувалося. Допоможіть мені.

Вимога:

У мене 2 папки А і В.

У папці Присутні нові файли з деякими змінами в каталогах та підкаталогах.

У папці B деякі старі / існуючі файли з каталогами та підкаталогами.

Мені потрібно порівняти файли з однаковими іменами у папці A та папці B, включаючи каталоги та підкаталоги повністю, а потім скопіювати файли, з яких однакові в обох папках у папку C, з належною структурою каталогу з папки B.

ми можемо нехтувати, якщо нові папки, які є в папці А, але не в папці B.

Код, який я використав:

$folderA= \\share\newfiles

$folderB= D:\apps\Existingfiles

$folderC = \\share2\backup

$source1 = (Get-ChildItem -path $folderA)

$dest1 = (Get-ChildItem -path $folderB)

Compare-Object -ReferenceObject $dest1  -DifferenceObject $source1 -Property Name,Length -ExcludeDifferent -IncludeEqual|Where-Object {$_.SideIndicator -eq "=="} | 
    ForEach-Object {
        Copy-Item "$dest\$($_.Name)" -Destination $backup -Recurse -force
    } 

Ви просто порівнюєте Ім'я без частини піддерева, а також намагаєтесь скопіювати без частини піддерева, де такого файлу не існує.
LotPings

Підкажіть, будь ласка, правильним чином
Newuser2855

Відповіді:


0

Щоб мати ваше $source1/$dest1порівняння, вам потрібно зняти префікси $folderA/$folderBз FullName та зберегти як нову (обчислену) властивість.

Ця нова властивість буде містити частину підменю і назву (-> $ SubName).

Для кращого розуміння я вибрав інші імена змінних.

## Q:\Test\2018\10\29\SU_1370677.ps1

$RefBase  = 'K:\Bat\'   #  'D:\apps\Existingfiles\'
$DiffBase = 'C:\Bat\'   #  '\\share\newfiles\'
$Target   = 'A:\Bat\'   #  '\\share2\backup\'

$RefTree = Get-ChildItem $RefBase -File -Recurse | Select-Object Length,
           @{n='SubName';e={$_.FullName.Replace($RefBase,'')}}

$DiffTree =  Get-ChildItem $DiffBase -File -Recurse | Select-Object Length,
           @{n='SubName';e={$_.FullName.Replace($DiffBase,'')}}

Compare-Object -ReferenceObject  $RefTree `
               -DifferenceObject $DiffTree `
               -Property SubName,Length `
               -ExcludeDifferent `
               -IncludeEqual | Where-Object SideIndicator -eq "==" |
    ForEach-Object {
        $SourceFile = Join-Path  $DiffBase $_.SubName
        $TargetFile = Join-Path  $Target   $_.SubName
        $TargetDir  = Split-Path $TargetFile -Parent
        If (!(Test-Path $TargetDir)){MD $TargetDir | Out-Null}
        Copy-Item $SourceFile -Destination $TargetFile -Force
    }

BTW -ExcludeDifferent -IncludeEqual | Where-Object SideIndicator -eq "=="зайвий, виберіть будь-який.


Спасибі
великому
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.