Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск файлов (дата изменения с начала предыдущих суток) (http://forum.oszone.net/showthread.php?t=344110)

solonenko 19-02-2020 14:29 2910069

Поиск файлов (дата изменения с начала предыдущих суток)
 
Добрый день. Делается поиск файлов в указанном каталоге, включая вложенные папки с фильтром расширения.
Нужно найти все файлы, измененные вчера.
Однако если сейчас 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 2910070

Код:

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 2910072

Код:

((Get-Date)::today).adddays(-1)

Busla 19-02-2020 15:08 2910075

Правильнее было бы использовать
Код:

(Get-Date).date.AddDays(-1)
или
Код:

[datetime]::today.AddDays(-1)

solonenko 19-02-2020 15:12 2910077

YuS_2, Busla, Спасибо. все гениальное- просто!

Цитата:

Цитата Busla
Правильнее было бы использовать »

А почему "правильнее" и где про это можно почитать?

YuS_2 19-02-2020 15:27 2910083

скорее не правильнее, а привычнее... а правильность - понятие относительное. :)

Iska 19-02-2020 17:39 2910096

Цитата:

Цитата solonenko
А почему "правильнее" »

Потому что командлет 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 2910107

Цитата:

Цитата solonenko
А почему "правильнее" и где про это можно почитать? »

просто надо немножко вникнуть, что и как происходит

в случае
Код:

((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 2910129

Цитата:

Цитата Busla
скобки лишние
командлет 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 2910173

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

Iska 20-02-2020 14:49 2910204

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

YuS_2 20-02-2020 15:10 2910212

Charg,
Цитата:

Цитата Charg
более 20% разницы в производительности... очень даже имеет. »

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

Цитата:

Цитата Iska
такие вычисления внутрь цикла »

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

Charg 21-02-2020 09:37 2910298

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

solonenko 21-02-2020 15:26 2910346

Всем большое спасибо за дискуссию. Полезно


Время: 15:19.

Время: 15:19.
© OSzone.net 2001-