Рекурсивное копирование структуры папок, но исключение самого нового файла на самом низком уровне

Я пытаюсь создать сценарий PowerShell, который будет рекурсивно искать в подпапках / файлах и копировать их в новое место, сохраняя при этом структуру. Я добился этого ниже, но хочу также удалить самый новый файл в каждом нижнем подкаталоге.

Структура папки:

C: \ Engine \ analytics1 \ pa.kr
C: \ Engine \ analytics1 \ pa419.kdb
C: \ Engines \ analytics1 \ pa420.kdb
C: \ Engines \ analytics1 \ pa421.kdb ( самый новый файл)
C: \ engines \ analytics2 \ pb.kr
C: \ engines \ analytics2 \ pb240.kdb
C: \otors \ analytics2 \ pb241.kdb (самый новый файл)

Мне нужно исключить pa421.kdb & pb241.kdb файлы и рекурсивно скопировать все остальное. Я пробовал много способов с вложенным Get-ChildItem методом и убывающим временем создания с -Skip 1 логикой, но не смог заставить его работать.

if ($env:COMPUTERNAME.Contains("Test")) {
    $root_path = "C:"
    $backup_folder = "Appian\Backup"
}

$date = Get-Date -Format d.MMMM.yyyy.HH.mm.ss

New-PSDrive -Name "Backup" -PSProvider Filesystem -Root
$root_path\$backup_folder

$source1 = $root_path + "\engines"

$destination = "backup:\$date"
$path = Test-Path $destination

if ($path -eq $true) {
    #write-Host "Directory Already exists"
    Remove-PSDrive "Backup"#  -Force
} elseif ($path -eq $false) {
    cd backup:\
    mkdir $date

    Get-ChildItem $source1 -Recurse | ForEach-Object {
        Copy-Item -Path $_.FullName -Destination $_.FullName.Replace($source1, $destination + "\engines") -Force
    }

    #$backup_log = Dir -Recurse $destination | Out-File "$destination\backup_log.txt"
}

person Andrew Lineberger    schedule 15.08.2017    source источник
comment
Ваша иерархия папок неглубокая (т.е. только непосредственные подпапки C:\engines)? Или иерархия глубже?   -  person Ansgar Wiechers    schedule 15.08.2017
comment
Иерархия глубже. Родительская папка - движки, подпапка - аналитика, подпапка - gw1, файл - pb240.kdb.   -  person Andrew Lineberger    schedule 15.08.2017
comment
И файлы, которые вы хотите исключить, находятся на разных уровнях иерархии или всегда находятся в непосредственных подпапках C:\engines?   -  person Ansgar Wiechers    schedule 15.08.2017
comment
Файлы, которые я хочу исключить, находятся на том же уровне, что и остальные файлы, и всегда находятся в непосредственных подпапках.   -  person Andrew Lineberger    schedule 15.08.2017


Ответы (1)


Составьте список файлов, которые вы хотите исключить:

$exclude = Get-ChildItem C:\engines\*\*.kdb | Group-Object Directory | ForEach-Object {
    $_.Group | Sort-Object -Desc | Select-Object -First 1 -Expand FullName
}

Затем перейдите в C:\engines, исключите эти файлы из списка результатов и скопируйте остальные:

Get-ChildItem C:\engines -Recurse -File | Where-Object {
    $exclude -notcontains $_.FullName
} | Copy-Item -Destination { $_.FullName -replace '^C:', $destination }
person Ansgar Wiechers    schedule 15.08.2017
comment
Спасибо, Ансгар! Так что увлекся созданием одного лайнера, не думал создавать исключения. Работает отлично! - person Andrew Lineberger; 16.08.2017