Я новичок в PowerShell, изучив некоторые учебники, я создал код для моего требования. Но результат был не так, как ожидалось. Пожалуйста, помогите мне.

Требование:

У меня есть 2 папки A и B.

В папке A присутствуют новые файлы с некоторыми изменениями в каталогах и подкаталогах.

В папке B некоторые старые / существующие файлы с каталогами и подкаталогами.

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

мы можем пренебречь, если новые файлы, которые присутствуют в папке A, но не в папке 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
    } 

1 ответ1

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 "==" является избыточным, выберите любой из них.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .