Sie gießen Datumsangaben in Strings und dies führt zu unterschiedlichen Ergebnissen in der ISE- und PowerShell-Konsole.
Schau dir deine from073.rar
Datei an:
- ISE-Datum: 10/05 / 2015
- Datum der PowerShell-Konsole: 5/10 / 2015
Du solltest besser loswerden .ToShortDateString()
und Termine direkt vergleichen. Siehe diese Frage: Powershell: Datumsvergleich
Obwohl die Zeichenfolgen in ISE und in der PowerShell-Konsole unterschiedlich dargestellt werden, ist der Vergleich Äpfel zu Äpfeln, daher sollten die Ergebnisse gleich sein.
Ja, aber Ihre "Äpfel" sind in diesem Fall Zeichencodes. Ich bin mir sicher, dass dies nicht das ist, was Sie vergleichen wollten. Beispiel:
'a' -gt 'b'
istfalse
, weil der Zeichencode vona
niedriger ist als der Zeichencode vonb
.'ac' -gt 'ab'
isttrue
, weil der Zeichencodea
für beide Zeichenfolgen derselbe ist, der nächste Zeichencode der linken Zeichenfolge (c
) jedoch größer ist als der zweite Zeichencode der rechten Zeichenfolge (b
).
Wenn Sie also Code in ISE ausführen, der dd/mm/yyyy
format verwendet, vergleicht Ihr Code nur den ersten dd
Teil und ignoriert ihn mm/yyyy
, da er zufällig gleich ist. Und Sie erhalten durch reinen Zufall korrekte Ergebnisse. Das Datumsformat in der PowerShell-Konsole ist also mm/dd/yyyy
, so dass Ihr Code wie gewünscht bricht.
Dies ist meine neue Linie:
Get-ChildItem -filter "*.rar" | Foreach-Object { if((get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d )) { " " -f $_.name, (get-date $_.lastwritetime -Format d) } }
Aber der Vergleich funktioniert nicht.
Nun geht es wieder: Sie verwenden -Format d
, was das Datumsobjekt in einen String konvertiert. Und Sie wissen schon, wohin es führt.
Wenn Sie Dateien erhalten möchten, die älter als ein Tag sind, sollte Ihr Code folgendermaßen aussehen (beachten Sie, wie zwei DateTime- Objekte direkt verglichen werden, keine Zeichenfolgen betroffen):
Get-ChildItem -Filter '*.rar' | Foreach-Object { if($_.LastWriteTime -lt (Get-Date).AddDays(-1)) { ' ' -f $_.Name, $_.LastWriteTime } }