2017-09-29 1 views
-2

Ich möchte wirklich dieses Skript "beenden". Ich habe bereits ein kleines Skript erstellt, aber mit diesem kann ich nur die Dateien aus dem ersten Wörterbuch löschen, das ich eingegeben habe.Powershell Vergleichen Sie die Lastwritedate und löschen Sie die Datei/en

Das Skript shoud zwei Ordner vergleichen und wenn Dateien mit dem gleichen Namen i wählen möchten, wenn ich die ältere Version davon oder die neuere Version löschen möchten.

// bearbeiten

$path1 = Read-Host "Name the 1st Path" 
$path2 = Read-Host "Name the 2nd Path" 
$Folder1 = Get-ChildItem -Path $pfad1 -Recurse 
$Folder2 = Get-ChildItem -Path $pfad2 -Recurse 
Write-Host "####################################" 
Write-Host (Get-ChildItem $pfad1,$pfad2).count 
Write-Host "Files are in the folder" 
Write-Host "####################################" 
$frage = Read-Host "Are you sure you want to delete the files YES/NO ?" 


if ($frage -eq $NO) { "Files stay " ; exit } 
else { 
     Compare-Object -ReferenceObject $Folder1 -DifferenceObject $Folder2 
-IncludeEqual | 
      Where-Object {$_.SideIndicator -eq "=="} | 
      ForEach-Object { 
      Remove-Item $_.InputObject.FullName | where { $_.lastwritetime -lt $altdate } 
      } 
       } 
+0

Bitte fügen Sie hinzu, was Sie bisher versucht haben und beschränken Sie Ihre Frage auf ein bestimmtes Problem. SO ist keine Code schreiben Seite –

+0

Fertig, und ty für die Info – BGL

Antwort

0

Je nach Größe Ihrer Ordner dies möglicherweise nicht die performante Art und Weise, dies zu tun. Aber es funktioniert.

$files = $folder1 + $folder2 
$files | 
    Group-Object name | 
    Foreach-Object { 
     $_.Group | 
     Sort-Object LastWriteTime | 
     Select-Object -Last 1 
    } | 
    Remove-Item -Force 

ok. Iv'e hat meine ursprüngliche Antwort überarbeitet, um einige seiner Mängel zu beheben. Diese Antwort gibt Ihnen die Möglichkeit zu sehen, was mit dem Testcode gelöscht und beibehalten wird. Ich weiß, dass ich einen richtigen verbose Schalter und whatif Funktion hätte verwenden können, aber das schien einfacher. Ive adressiert das Ordnungsproblem und das Problem, in dem nicht doppelte Einzelteile gelöscht würden.

$folder1 = 'c:\temp\reports1' 
$folder2 = 'c:\temp\reports2' 


function Get-FilesForDeletion ($folder1, $folder2, [switch] $verbose){ 
    $files1 = Get-ChildItem $folder1 
    $files2 = Get-ChildItem $folder2 

    $files = $files1 + $files2 

    $i = ($files | Select-Object -ExpandProperty Directory | Measure-Object -Maximum -Property Length).Maximum 

    $files | 
     Group-Object name | 
     Where-Object Count -gt 1 | 
     Foreach-Object {  
      $process = $_ 

      $deleteMe = $process.Group | 
        Sort-Object LastWriteTime -Descending | 
        Select-Object -Last 1 

      if($verbose){ 
       Write-Host "Processing $($process.Group.Name)..." 

       $keepThese = $process.Group | 
        Sort-Object LastWriteTime | 
        Select-Object -Skip 1 

       Write-Host " - Delete $(($deleteMe.Directory.FullName).PadRight($i)) - LastWriteTime $($deleteMe.lastWriteTime) " 

       $keepThese | ForEach-Object { 
        Write-Host " - Keep $(($_.Directory.FullName).PadRight($i)) - LastWriteTime $($_.lastWriteTime) " 
       }    

       write-host " " 
       write-host " " 
      } 

      $deleteMe 
     } 
} 

# testing code 
#Get-FilesForDeletion -folder1 $folder1 -folder2 $folder2 -verbose | Out-Null 

Get-FilesForDeletion -folder1 $folder1 -folder2 $folder2 -verbose | Remove-Item 
+0

Vielen Dank, es funktioniert! – BGL

+0

Könnten Sie dies als beantwortet markieren – Steve

+0

Zum ersten Mal habe ich versucht, es hat funktioniert. Jetzt funktioniert es nicht mehr. Es löscht nur die neueste Datei und vergleicht nicht die Dateinamen ... – BGL

Verwandte Themen