2017-08-15 51 views
0

我試圖創建一個PowerShell腳本,它將遞歸搜索子文件夾/文件並在保留結構的同時將它們複製到新位置。我已經實現了下面的內容,但也想刪除每個最低子目錄中的最新文件。遞歸地應對文件夾結構,但排除最低級別的最新文件

文件夾結構:

C:\發動機\ analytics1 \ pa.kr
C:\發動機\ analytics1 \ pa419.kdb
C:\發動機\ analytics1 \ pa420.kdb
C:\發動機\ analytics1 \ pa421.kdb(最新的文件)
C:\發動機\ analytics2 \ pb.kr
C:\發動機\ analytics2 \ pb240.kdb
C:\發動機\ analytics2 \ pb241.kdb(最新的文件)

我的ne d是排除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" 
} 
+0

是您文件夾層次淺(即只是'C:\ engines'的直接子文件夾)?還是層次更深? –

+0

層次更深。父文件夾 - 引擎,子文件夾 - 分析,子文件夾 - gw1,文件 - pb240.kdb。 –

+0

你想要排除的文件在不同的層次上,或者總是在'C:\ engines'的直接子文件夾中? –

回答

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 } 
+0

謝謝Ansgar!因此,在製作一個班輪時遇到了這個問題,他們沒有想到要排除排除。很棒! –

相關問題