2017-08-15 2 views
0

Ich versuche ein PowerShell-Skript zu erstellen, das Unterordner/Dateien rekursiv durchsucht und sie unter Beibehaltung der Struktur an einen neuen Speicherort kopiert. Ich habe das unten erreicht, aber möchte auch die neueste Datei in jedem untersten Unterverzeichnis entfernen.Kopieren der Ordnerstruktur rekursiv, aber ohne die neueste Datei auf niedrigster Ebene

Ordnerstruktur:

C: \ Engines \ analytics1 \ pa.kr
C: \ Engines \ analytics1 \ pa419.kdb
C: \ Engines \ analytics1 \ pa420.kdb
C: \ Motoren \ analytics1 \ pa421.kdb (neueste Datei)
C: \ Engines \ analytics2 \ pb.kr
C: \ Engines \ analytics2 \ pb240.kdb
C: \ Engines \ analytics2 \ pb241.kdb (neueste Datei)

Meine nee d soll pa421.kdb & pb241.kdb Dateien ausschließen und alles andere rekursiv kopieren. Ich habe diese vielen Möglichkeiten mit verschachtelten Get-ChildItem Methode und absteigende Erstellungszeit mit Logik versucht, aber konnte es nicht zur Arbeit bekommen.

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

Ist Ihr Ordnerhierarchie flach (dh nur die unmittelbaren Unterordner von 'C: \ engines')? Oder ist die Hierarchie tiefer? –

+0

Die Hierarchie ist tiefer. Übergeordneter Ordner - Suchmaschinen, Unterordner - Analysen, Unterordner - gw1, Datei - pb240.kdb. –

+0

Und die Dateien, die ausgeschlossen werden sollen, sind auf verschiedenen Hierarchieebenen oder immer in den unmittelbaren Unterordnern von 'C: \ engines'? –

Antwort

0

Erstellen Sie eine Liste der Dateien, die Sie ausgeschlossen werden sollen:

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

Dann in C:\engines Rekursion, die Dateien aus der Ergebnisliste ausschließen, und kopieren Sie den Rest:

Get-ChildItem C:\engines -Recurse -File | Where-Object { 
    $exclude -notcontains $_.FullName 
} | Copy-Item -Destination { $_.FullName -replace '^C:', $destination } 
+0

Danke Ansgar! So in einen One Liner eingewickelt, dachte nicht daran Ausschlüsse zu bauen. Funktioniert super! –

Verwandte Themen