Сравнение подпапок и копирование файлов с помощью PowerShell - PullRequest
0 голосов
/ 01 июля 2011

В продолжение моего предыдущего поста здесь: Сравнение папок и содержимого с помощью PowerShell

... Я пытаюсь сравнить две директории, которые содержат подпапки (не менее 4 уровней). Вторая папка (folder2) содержит новые и обновленные файлы, которые я хочу скопировать в третью папку (folder3). Пока что мой сценарий работает не совсем так, как ожидалось. Первая проблема: подпапки в папке 2 должны быть созданы в папке 3. Каков наилучший способ сделать это? Кроме того, не все файлы (новые или обновленные) копируются в папку 3 из папки 2.

В любом случае, вот мой сценарий:

$Folder1 = "D:\folder1" 
$Folder2 = "D:\folder2"
$Folder3 = "D:\folder3"

function Get-Directories ($path)
{
    $PathLength = $path.length
    gci $path -rec | % {
        Add-Member -InputObject $_ -MemberType NoteProperty -Name RelativePath -Value $_.FullName.substring($PathLength+1)
        $_
    }
}

Compare-Object (Get-Directories $Folder1) (Get-Directories $Folder2) -prop RelativePath, Name, Length |
Sort RelativePath, Name, Length -desc | % {
if ($file -ne $_.RelativePath)
{ $_ }
$file = $_.RelativePath
} | Where-Object {$_.SideIndicator -eq "=>"} | ForEach-Object {Copy-Item ("$Folder2\" + $file) -Destination ("$Folder3\" + $file) -Force}

1 Ответ

0 голосов
/ 02 июля 2011

Ниже я внес некоторые изменения, которые, похоже, решают мою проблему.

function Get-Directories ($path)
{
    $PathLength = $path.length
    Get-ChildItem $path -Recurse | % {
        Add-Member -InputObject $_ -MemberType NoteProperty -Name RelativePath -Value $_.FullName.substring($PathLength+1)
        $_
    }
}

Compare-Object (Get-Directories $Folder1) (Get-Directories $Folder2) -Property RelativePath, Name, Length |
Sort RelativePath, Name, Length -desc | % {
    if ($file -ne $_.RelativePath) { $_ } } | 
    Where-Object {$_.SideIndicator -eq "=>"} | 
    ForEach-Object {
        $file = $_.RelativePath
        Echo F | xcopy "$Folder2\$file" "$Folder3\$file" /S
    }
...