PDA

Показать полную графическую версию : [решено] Поиск файлов (дата изменения с начала предыдущих суток)


solonenko
19-02-2020, 14:29
Добрый день. Делается поиск файлов в указанном каталоге, включая вложенные папки с фильтром расширения.
Нужно найти все файлы, измененные вчера.
Однако если сейчас 12-00, и файл изменен вчера в 9-00 - в результат поиска он не попадает (что логично)
Если сделать adddays(-2) - туда попадут файлы в т.ч. с позавчера..

Get-ChildItem "C:\fb\log\*" -include *.txt -Recurse | where-object {$_.LastWriteTime -ge ((Get-Date).adddays(-1))}

solonenko
19-02-2020, 14:50
PS C:\WINDOWS\system32> (Get-Date).AddDays(-1)
18 февраля 2020 г. 14:49:12

PS C:\WINDOWS\system32> (Get-Date '19.02.2019').adddays(-1)
18 февраля 2019 г. 0:00:00

Опять же, все логично. Но как это использовать в условии поиска?

YuS_2
19-02-2020, 14:59
((Get-Date)::today).adddays(-1)

Busla
19-02-2020, 15:08
Правильнее было бы использовать
(Get-Date).date.AddDays(-1)
или
[datetime]::today.AddDays(-1)

solonenko
19-02-2020, 15:12
YuS_2, Busla, Спасибо. все гениальное- просто!

Правильнее было бы использовать »
А почему "правильнее" и где про это можно почитать?

YuS_2
19-02-2020, 15:27
скорее не правильнее, а привычнее... а правильность - понятие относительное. :)

Iska
19-02-2020, 17:39
А почему "правильнее" »
Потому что командлет Get-Date, несмотря на своё название, возвращает дату-время (тип System.DateTime). Текущую дату и текущее время (некий аналог функции Now() в VBScript/VB/VBA). И в методе .AddDays(…) задействуется всё значение, а не только дни. Посему, при целом значении аргумента метода, количество дней увеличивается или уменьшается, а значение времени остаётся прежним. При дробном значении аргумента количество дней может как меняться, так и оставаться прежним, а вот значение времени заведомо изменится:
PS C:\> Get-Date
среда, 19 февраля 2020 года 17:30:06

PS C:\> (Get-Date).AddDays(-1)
вторник, 18 февраля 2020 года 17:30:11

PS C:\> (Get-Date).AddDays(-0.5)
среда, 19 февраля 2020 года 05:30:18

Свойство .Date класса System.DateTime возвращает значение того же самого типа System.DateTime, но с приведённым к нулю значением времени:
PS C:\> (Get-Date).Date
среда, 19 февраля 2020 года 00:00:00

Статическое свойство .Today того же самого класса System.DateTime также возвращает значение типа System.DateTime с текущей датой и с приведённым к нулю значением времени.

И посему «вчера» (.AddDays(-1)) в вышеприведённых коллегой Busla кодах будет означать «сутки назад, считая от нуля часов нуля минут сегодняшнего числа».

Busla
19-02-2020, 19:23
А почему "правильнее" и где про это можно почитать? »
просто надо немножко вникнуть, что и как происходит

в случае
((Get-Date)::today).adddays(-1)
скобки лишние
командлет Get-Date обращается к конструктору класса datetime
получает объект с текущим моментом времени
получает из объекта ссылку на родительский класс - всё тот же datetime
выкидывает объект
обращается к специализированному конструктору класса datetime
получает объект с моментом начала суток
вычитает один день

код
[datetime]::today.AddDays(-1)
обращается к специализированному конструктору класса datetime
получает объект с моментом начала суток
вычитает один день

понятно, что если постоянно использовать подобные окольные пути, программы будут работать дольше и памяти требовать больше

вариант
(Get-Date).date.AddDays(-1)
ресурсы не экономит, но вместо Get-Date может быть любой момент времени, и всё будет считаться относительно него
т.е. это "чистая функция" которая не использует side-эффекты - код с ней проще отлаживать, изменять, переиспользовать

YuS_2
19-02-2020, 23:20
скобки лишние
командлет Get-Date обращается к конструктору класса datetime
получает объект с текущим моментом времени
получает из объекта ссылку на родительский класс - всё тот же datetime
выкидывает объект
обращается к специализированному конструктору класса datetime
получает объект с моментом начала суток
вычитает один день »
аргумент...
Но на практике, первичное обращение:
measure-command{((Get-Date)::today).adddays(-1)}

Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 47
Ticks : 470354
TotalDays : 5,44391203703704E-07
TotalHours : 1,30653888888889E-05
TotalMinutes : 0,000783923333333333
TotalSeconds : 0,0470354
TotalMilliseconds : 47,0354


measure-command{[datetime]::today.AddDays(-1)}

Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 60
Ticks : 601712
TotalDays : 6,96425925925926E-07
TotalHours : 1,67142222222222E-05
TotalMinutes : 0,00100285333333333
TotalSeconds : 0,0601712
TotalMilliseconds : 60,1712

- не имеет значительных отличий, а при повторных обращениях (в обоих случаях) скорость выполнения измеряется тиками, т.е. она менее миллисекунды. Так что "правильность" - в данном случае, имеет только чисто академическое/теоретическое значение. :)

Charg
20-02-2020, 11:47
YuS_2, более 20% разницы в производительности... очень даже имеет.
Если такой командлет будет вызываться 20 раз в функции, которая будет вызываться 50 раз в скрипте - получится значительная задержка, которой могло бы и не быть.
Что уж говорить если такую функцию воткнут в foreach

Iska
20-02-2020, 14:49
Charg, тому, кто втыкает такие вычисления внутрь цикла (или «20 раз по 50 раз»), надо переучиваться (или доучиваться).

YuS_2
20-02-2020, 15:10
Charg, более 20% разницы в производительности... очень даже имеет. »
Возможно. Только вот... даже если зацепиться за эти 20%, то получится, что теория противоречит практике. Это в том смысле, что более быстрое, прямое обращение к классу [datetime], работает медленнее, чем "кривое" (через командлет)... :)
У меня это получалось на различных компьютерах и именно при первичном обращении (если что, то проверялось в различной последовательности запуска).
На самом деле, эта разница, скорее всего, получается из-за статистической ошибки, на которую могут влиять многие факторы в ОС. Чтобы получить более достоверные варианты, надо просто запустить многократные тесты... но в виду того, что различие-то незначительное, особенно, при повторном обращении, сам я этого делать не стал...

такие вычисления внутрь цикла »
Хмм, вроде до сих пор никто и не заикался даже про циклы... про что спич? :)
Всё, понял про что речь...

Charg
21-02-2020, 09:37
Iska, с чего бы вдруг? Ну вот написал кто-нибудь модуль в функцией Do-UsefulStuff, ты его скачал и используешь. Как можно понять "хорошо" модуль написан или "плохо"? Лазить изучать исходники каждого качаемого модуля перед использованием?

solonenko
21-02-2020, 15:26
Всем большое спасибо за дискуссию. Полезно




© OSzone.net 2001-2012