сравнение системной даты с датой журнала и отображение только записей журнала после системной даты - pshell - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть файл журнала с форматом даты yyyy-MM-dd HH:mm:ss,FFF, например:

2018-11-20 15:45:58,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-20 15:45:58,021 [No|SeSt] [2] [Session#-2,Username=2] INFO  is running
2018-11-20 15:45:58,031 [No|SeSt] [3] [Session#-3,Username=3] INFO  is running

Мне нужно сравнить это с системной датой и отображать только журналы, которые превышают установленную системную дату

У меня есть $logDate уже в формате yyyy-MM-dd HH:mm:ss,FFF, но $_.[datetime] на самом деле является системной датой с текущей датой и 00: 00: 00,000

get-content -Path $file -Tail 100 |  where-object {  $_.[datetime] $_.split()[0] -le $logDate}

Мне, вероятно, нужно извлечь датуиз файла журнала 1-й?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ваша команда не так уж плоха и намного эффективнее, чем ответ @ Lee_Dailey,
необходимо удалить только $_. перед [datetime] (и -le должно быть -gt),
но для сравнения используется только дата.

Предполагается, что вы хотите сравнить все элементы даты, включая доли секунд:

## Q:\Test\2018\11\20\SO_53398055.ps1
$File = '.\SO_53398055.log'
$dtFormat = 'yyyy-MM-dd HH:mm:ss,FFF'
$logDate = [datetime]::ParseExact('2018-11-20 15:45:58,018',$dtFormat,$Null)

Get-Content -Path $file -Tail 100 |
  Where-Object {[datetime]::ParseExact( ($_.split('[')[0]).Trim(), $dtFormat,$Null) -gt $logDate}

Где Where выглядит немного многолюдно, потому что яиспользуйте [, чтобы разделить строку ввода, а затем необходимо обрезать завершающий пробел.
Мой выбранный logDate находится между 1-й и 2-й записями журнала и, как ваш текст говорит only logs which are greater than a set system date отклоняется от вашего кода, который сравнивает меньшеили даже я ожидаю этот вывод

> Q:\Test\2018\11\20\SO_53398055.ps1
2018-11-20 15:45:58,021 [No|SeSt] [2] [Session#-2,Username=2] INFO  is running
2018-11-20 15:45:58,031 [No|SeSt] [3] [Session#-3,Username=3] INFO  is running
0 голосов
/ 20 ноября 2018

это делает то, что вы, кажется, описываете.однако я не могу понять, почему вы проверяете даты в будущем ... [ ухмылках ]

# read in a text file
#    in real life, use Get-Content
$InStuff = @'
2018-11-21 21:21:21,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-19 19:19:19,021 [No|SeSt] [2] [Session#-2,Username=2] INFO  is running
2018-11-20 20:20:20,031 [No|SeSt] [3] [Session#-3,Username=3] INFO  is running
2018-11-22 22:22:22,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-23 23:23:23,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-18 18:18:18,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
'@ -split [environment]::NewLine

# get today at midnite, not "now"
$Today = (Get-Date).Date

$Results = foreach ($IS_Item in $InStuff)
    {
    $DateString = $IS_Item.Split(' ')[0].Trim()
    $ParsedDate = [datetime]::ParseExact($DateString, 'yyyy-MM-dd', $Null)

    if ($ParsedDate -gt $Today)
        {
        $IS_Item
        }
    }

$Results

выходных ...

2018-11-21 21:21:21,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-22 22:22:22,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
2018-11-23 23:23:23,011 [No|SeSt] [1] [Session#-1,Username=1] INFO  is running
...