2017-02-27 4 views
1

Ich habe ein Skript, das einen Ordner untersucht und die älteste Datei (von LastWrittenTime) findet und die LastWriteTime der gefundenen Datei in eine Protokolldatei schreibt.PowerShell Dateien eins nach dem anderen finden

Wenn ich dieses Skript erneut ausführen möchte ich, dass es die nächste älteste Datei findet, die LastWriteTime größer als die zuvor in die Protokolldatei geschrieben hat.

Aber es gibt ein Problem. Mein Skript kann immer nur die älteste Datei im Ordner finden und ignoriert die Datei in der Protokolldatei.

Mein Skript:

$programdir = "C:\Data\PowerShell\Learning" 
$folder = "C:\Data\PowerShell\Learning\folder" #there is the files 
$TimeLog = "$programdir\LastFileDate.log" #this file contains the last found file's LastWriteTime attribute 
$LastWriteTime = Get-Content $TimeLog 
$File = Get-ChildItem -Path $folder | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | Where-Object {$_.LastWriteTime -gt $LastWriteTime} 
Clear-Content $TimeLog 
$File.LastWriteTime | Set-Content $TimeLog 
+0

alle Datei mal bekommt mehr als eine Zeile ist und vergleichen sie selbst – Drako

Antwort

1

Sie sofort Ihre Auswahl mit dieser Zeile gesetzt Krüppel. Insbesondere wo Sie haben Select-Object -Last 1:

$File = Get-ChildItem -Path $folder | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | Where-Object {$_.LastWriteTime -gt $LastWriteTime} 

In der zweiten letzte Rohr Anweisung Sie Ihre Auswahl auf 1 Datei eingestellten Grenzwert. Danach wenden Sie Ihre Datumslogik an. Sie müssen nach Ihren Daten filtern zuerst dann greifen Sie den entsprechenden Eintrag.

Get-ChildItem -Path $folder -File | 
    Sort-Object LastWriteTime -Descending | 
    Where-Object {$_.LastWriteTime -lt $LastWriteTime} | 
    Select-Object -First 1 

Es gibt noch andere ähnliche Ansätze, die auch funktionieren würde.


Auch ...

Clear-Content $TimeLog 
$File.LastWriteTime | Set-Content $TimeLog 

Das ist überflüssig, da Set-Content standardmäßig überschrieben. Sie können die Clear-Content entfernen.

Während dies kein Problem in Ihrem Code ist, beachten Sie, dass $LastWriteTime, wie von Get-Content zurückgegeben, ein String und kein datetime Objekt ist. Da es auf der RHS der Anweisung in Ihrer WHERE-Klausel ist, wird als [datetime] zum Zweck der Bewertung der Klausel umgewandelt.

auch vorsichtig sein, dass der Code anders handeln könnte, wenn es in Ihrem $timelog

+0

mit dem ältesten beginnen müssen! Also ist das Where-Objekt {$ _. LastWriteTime -lt $ LastWriteTime} nicht korrekt. Muss mit -gt $ LastWriteTime. Und am Ende wird es Teil der Do-While-Schleife! Haben Sie eine andere Idee? –

+0

@NorbertKiss Hast du es tatsächlich zuerst versucht? In der Praxis hat das gut funktioniert. Wir müssen zuerst alle zuerst vor diesem Datum packen und uns die neueste holen. – Matt

Verwandte Themen