2016-11-21 5 views
0

Mit diesem Befehl ich für die neueste Datei in einem Verzeichnis suchen:finden neueste Datei im Verzeichnis, und wählen Sie dann alle Dateien mit dem gleichen Datetime

gci C:\temp | sort LastWriteTime -descending | select -first 1 

Meine Auswahl ist ziemlich groß, mit 60'000 + txt Dateien. Das Ausführen dieses Befehls nimmt:

PS C:\xy> measure-command {gci C:\temp | sort LastWriteTime -descending | select -first 1} 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 13 
Milliseconds  : 465 
Ticks    : 134657703 
TotalDays   : 0.000155853822916667 
TotalHours  : 0.00374049175 
TotalMinutes  : 0.224429505 
TotalSeconds  : 13.4657703 
TotalMilliseconds : 13465.7703 

Wie Sie sehen können, dieser Befehl dauert eine lange Zeit zu beenden.

Meine Aufgabe ist es, alle Dateien, die die gleiche LastWriteTime-Eigenschaft haben, als die Datei zu erhalten, die der Befehl zurückgibt (auf die Minute).

habe ich versucht, so etwas wie dieses:

$file = gci C:\temp -OutVariable files | sort LastWriteTime -descending | 
     select -first 1 | % { $_.LastWriteTime } 
$myfiles = $files | ? {$_.LastWriteTime -like $file} 

wenn ich $file vergleichen, die die Lastwritetime gefunden wird, und $myfiles, die alle Dateien mit dem gleichen Lastwritetime enthalten sollte, $myfiles immer nur eine Datei enthält - dies, weil das ist Sekunden sind für jedes Objekt unterschiedlich:

PS C:\xy> $file 

Montag, 21. November 2016 13:10:08 

Wie kann ich die Dateien, die ich brauche, indem sie ihre Eigenschaften zu vergleichen Lastwritetime?

+0

entweder Sie einen Tippfehler haben oder Ihr Skript wird nicht funktionieren.Ihre Skripte sagen '$ file =', aber es sollte '$ files =' sein, auch die zweite Zeile beginnt mit 'files' anstelle von' $ files' – 4c74356b41

+0

@ 4c74356b41 '$ file' sollte die LastWriteTime des gefundenen Objekts enthalten, während '$ files' sollte direkt nach dem gci Call (OutVariable) – SimonS

+1

erstellt werden oh, es sollte' -OutVariable files', no '$' sein, auch was erreicht dies: '% {$ _. LastWriteTime}' – 4c74356b41

Antwort

2

$myfiles enthält immer nur eine Datei - das ist, weil die Sekunden für jedes Objekt unterschiedlich sind: nur

vergleichen Dann die Teile des Zeitstempels, an denen Sie interessiert sind - in diesem Beispiel vergleichen wir sie mit der Minute:

$Timestamp = $file.ToString('yyyyMMddHHmm') 

$myfiles = $files | ? {$_.LastWriteTime.ToString('yyyyMMddHHmm') -eq $file} 
+1

manchmal sollte ich ein bisschen mehr denken und die Antwort selbst bekommen - nur wie in diesem Fall. Vielen Dank! – SimonS

+0

@SimonS manchmal helfen zusätzliche Augen ;-) –

-1

Suchst du eine exakte Übereinstimmung? Bist du sicher, dass du mindestens eins bekommen wirst? Wenn Sie Sie sind, müssten Sie -eq Operand verwenden.

$myfiles = $files | ? {$_.LastWriteTime -eq $file} 
+0

Das Problem ist, LastWriteTime gibt zurück: Stunde: Minute: Sekunden. Da nicht alle Dateien zur gleichen Zeit erstellt werden, muss ich nur die Stunde: Minute – SimonS

+0

gut vergleichen, deshalb frage ich, ob Sie eine genaue Übereinstimmung benötigen, und Sie haben sie nicht angegeben. – 4c74356b41

-1

Paar von Ideen, um dies zumindest ein wenig zu beschleunigen. Nicht sicher, wie viel sie erreichen werden, thou. Und dies nicht getestet, so kann Fehler enthalten;)

$file = ((gci C:\temp -OutVariable files).LastWriteTime | sort -Descending)[0] 

$myfiles = $files.Where{$_.LastWriteTime -match $file} 
+0

nicht viel Unterschied, 'gci' nimmt 99% der Zeit, und das wird nicht anders sein, indem Pipelines eliminiert - aber danke ;-) – SimonS

1

Ich denke, Sie brauchen nur zu Jahr, Monat, Tag, Stunde und Minute

$myfiles = $files | ? {$_.LastWriteTime.Year -eq $file.Year ` 
        -and $_.LastWriteTime.Month -eq $file.Month ` 
        -and $_.LastWriteTime.Day -eq $file.Day ` 
        -and $_.LastWriteTime.Hour -eq $file.Hour ` 
        -and $_.LastWriteTime.Minute -eq $file.Minute } 
0

Es scheint, wie Sie Zeit nur vergleichen möchten und nicht Datum, so gibt es eine Methode Fileinfo, die ich verwenden würde, um der Vergleich ist einfacher.

Besorgen Sie sich die Zeit, die Sie sind nach:

$time = (Get-ChildItem -Path C:\temp -Filter "*.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).LastWriteTime.ToShortTimeString() 

Dann die Dateien packen, die passen:

Get-ChildItem -Path C:\temp -Filter "*.txt" | Sort-Object LastWriteTime | Where-Object { $_.LastWriteTime.ToShortTimeString() -eq $time } 
Verwandte Themen