Powershell Script zum ausgeben von neuster Datei?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Die neuste Datei in einem ganzen Verzeichnisbaum zu finden ist recht simpel:

  • Ordner Rekursive nach Dateien durchsuchen
  • alle gefundenen Dateien für die Property LastWriteTime absteigend durchsuchen (höchter Wert zuerst)
  • der erste wert hat das Neueste Datum
$Folder = "$Env:Userprofile\Desktop"  #zur Demo aktueller Desktop
  #Erroraction setzen , es gibt Pfade, af welche  man mit Userprivilegien nicht zugreifen kann!
$NewestFile = Get-ChildItem -Path $Folder -File -Recurse -Erroraction SilentlyContinue |
    Sort-Object -Property LastWriteTime -Descending |
    Select-Object -First 1
    
'NewestFile in FolderTree: "{0}" is: "{1}" from {2:g}'-f $Folder, $NewestFile.FullName, $NewestFile.LastWriteTime
pause

Um für jeden Ordner im Tree die neuste Datei zu ermitteln, müssen wir etwas anders vorgehen

  • Erstmal speichern wir den Startordner in ein Liste
  • fügen auch noch alle übrigen Folder hinzu
  • führen wir obiges Prozetere für jeden Ordner in unserer Liste aus (...aber ohne Rekursion)
$StartFolder = "$Env:Userprofile\Desktop"


 #erstmal das StartOrdner-Objekt in die Liste schreiben.
 #Achtung Explizit festlegen, das  die Variable ein Array ist
[Array]$FolderList = get-Item $StartFolder
 # Alle übrigen Ordner im Tree "merken"
$FolderList += Get-ChildItem -Path $StartFolder -Directory -Recurse -Erroraction SilentlyContinue
 
 # aus jedem einzelnen Ordner  in der Liste  die Neueste Datei ermitteln
$NewestFilesList = $FolderList|
    ForEach-Object {
          #wie gehabt, nur ohne Recursion , die haben wir ja schon in der Ordnerliste
        $currentPath = $_.FullName
        $NewestFile = Get-ChildItem -Path $currentPath -File -Filter *.* -Erroraction SilentlyContinue|
            Sort-Object -Property LastWriteTime -Descending |
            Select-Object -First 1
         #manche Ordner haben keine Dateien...
        if ($NewestFile) {
            Write-Host ('NewestFile in Folder: "{0}" is: "{1}" from {2:g}'-f $currentPath, $NewestFile.Name, $NewestFile.LastWriteTime)
            $NewestFile  #in Pipe schreiben
        }
        else {
            Write-Host ('Folder: "{0}" have no File'-f $currentPath ) -fo red
        }
    }
pause
$NewestFilesList |fl *   #optional  mal alle Details  der Dateien
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren