Получать файлы только с текущей даты

#powershell #where-clause

#powershell #where-предложение

Вопрос:

это может быть очень просто для большинства программистов Powershell, но я совершенно новичок в powershell и расстраиваюсь из-за простого запроса Where-Object.

Я собираю csv из папки:

 $files = Get-ChildItem $homedesktoptest*.csv -Recurse
  

Итак, результат выглядит следующим образом:

 Mode                LastWriteTime         Length Name                                                                                                  
----                -------------         ------ ----                                                                                                  
-a----       01.09.2020     11:38             16 a.csv                                                                          
-a----       01.09.2020     11:38             10 b.csv                                                                              
-a----       31.08.2020     13:39             10 c.csv                                                                              
-a----       01.09.2020     11:38             14 d.csv                                                                          
-a----       31.08.2020     13:39             14 e.csv                                                                          
-a----       31.08.2020     13:38             16 f.csv                                                                        
-a----       31.08.2020     13:40             17 g.csv                                                                                                                                           
  

И так далее .. пока все хорошо. Но теперь мне нужны только файлы .csv, соответствующие текущей дате. Итак, для моего понимания я должен сделать:

 $date = $(get-date)
$files2 = $files | Where-Object {($_.LastWriteTime -eq $date)}
  

Но результат в переменной files2 пуст. Я не знаю, почему:(

Ответ №1:

Несмотря на то, что Powershell будет представлять LastWriteTime как строку при записи в host, LastWriteTime на самом деле имеет тип DateTime .

 $files = Get-ChildItem $homedesktoptest*.csv -Recurse
$files.LastWriteTime[0].GetType()
  

Это означает, что, в свою очередь, ваше предложение where гласит «Получить все файлы, где LastWriteTime равно текущему времени», где текущее время — это точный момент, когда вы запустили Get-Date. Очевидно, что это всегда ничего не даст, если вам не случится записать файл в тот же самый момент, или поиграть с вашим системным временем, или в каком-либо другом крайнем случае.

Чтобы исправить это, получите объект DateTime и установите время на начало дня, вот так:

 $date = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)
  

Затем выполните поиск файлов, в которых значение LastWriteTime больше этого значения.

 $files2 = $files | Where-Object {($_.LastWriteTime -gt $date)}
  

Полный сценарий должен выглядеть следующим образом:

 $date = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)
$files = Get-ChildItem $homedesktoptest*.csv -Recurse
$files2 = $files | Where-Object {$_.LastWriteTime -gt $date}
$files2
  

Комментарии:

1. Большое вам спасибо. Итак, я был уже близок, но все же пока.. Спасибо за объяснение. Теперь я знаю, как немного лучше обрабатывать get-date 🙂