以递归方式处理文件夹结构,但不包括最低级别的最新文件

时间:2017-08-15 20:11:56

标签: powershell get-childitem

我正在尝试创建一个PowerShell脚本,该脚本将递归搜索子文件夹/文件,并在保留结构的同时将它们复制到新位置。我已经实现了以下功能,但是也希望删除每个最低子目录中的最新文件。

文件夹结构:

C:\发动机\ analytics1 \ pa.kr
C:\发动机\ analytics1 \ pa419.kdb
C:\发动机\ analytics1 \ pa420.kdb
C:\ engines \ analytics1 \ pa421.kdb(最新文件)
C:\发动机\ analytics2 \ pb.kr
C:\发动机\ analytics2 \ pb240.kdb
C:\ engines \ 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"
}

1 个答案:

答案 0 :(得分:0)

构建要排除的文件列表:

$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 }