如何使用 powershell 仅列出最近 3 小时内创建的日志文件中的字符串?

How can I use powershell to list only the strings in a log file created in the last 3 hours?

我有一个日志文件,其中日期和相应信息以字符串形式列出,格式为:

Tuesday, July 14, 2015 4:44:03 PM
Order Number 001006
Credit Card Type: AX
MessageType: 0100
Bit  2 [Primary_Account_Number..................] 3797*******1000
Bit  3 [Processing_Code.........................] 200000
Bit  4 [Amount_of_Transaction...................]     2.40
Bit 11 [Debit_Reg_E_Receipt_Number..............] 000083
Bit 14 [Expiration_Date.........................] 1704
Bit 18 [Merchant_Category_Code..................] 5812
Bit 22 [POS_Entry_Mode_PIN_Capability...........] 011
Bit 24 [Network_International_ID_NII............] 001
Bit 25 [POS_Condition_Code......................] 00
Bit 31 [Acquirer_Reference_Data.................] 2
Bit 37 [Retrieval_Reference_Number..............] 000000000283
Bit 41 [Terminal_ID.............................] 04765035
Bit 42 [Merchant_ID.............................] 000425249820993
Bit 59 [Merchant_ZIP_Postal_Code................] 19004

Tuesday, July 14, 2015 4:44:07 PM : Response:
Order Number 
Credit Card Type:   
MessageType: 0110
Bit  3 [Processing_Code.........................] 200000
Bit  4 [Amount_of_Transaction...................] 000000000240
Bit  7 [Transmission_Date_Time..................] 0714234410
Bit 11 [Debit_Reg_E_Receipt_Number..............] 000083
Bit 24 [Network_International_ID_NII............] 0001
Bit 25 [POS_Condition_Code......................] 00
Bit 37 [Retrieval_Reference_Number..............] 000000000283
Bit 39 [Response_Code...........................] 00
Bit 41 [Terminal_ID.............................] 04765035
Table 14
N                     000000000000000000000240

Table 22
APPROVAL        

此日志不断更新,但我想获取当前date/time并仅显示日志中从3 小时前到现在的信息。我需要日志中的所有信息,而不是 2015 年 7 月 14 日星期二 1:44:03 之前的任何信息(例如)。有什么方法可以获取当前 date/time 并在获取我需要的信息之前解析日志文件 3 小时?也许使用 Powershell 或某种 windows 端口的 unix 命令?目标是创建一个脚本,基本上截断日志以显示过去 3 小时的 activity,并将其输出到新日志中。我希望我已经足够清楚地说明了这一点。非常感谢任何帮助。

我在您更新 post 时更新了我的答案:

$path = 'C:\list.txt'
$file = Get-Content $path
$i = 0

$before = (Get-Date).AddHours(-3)

foreach ($line in $file)
{
    $i++

    if ($line -match ', 2015 ')
    {
        $date = [regex]::match($line,'(?<=day, )(.*\n?)(?<=M)').value | Get-Date

        if ($date -ge $before)
        {
            (Get-Content $path) | Select -Skip $($i-1)
            Break
        }
    }
}

好的,这会将布尔变量 $NewLogs 设置为 $false。然后它会读取您的日志文件,并针对每一行检查 $NewLogs 是否已设置为 $true,或者是否找到日期字符串,以及该日期字符串是否小于 3 小时.如果 $NewLogs 条件或日期字符串条件解析为真,则它会将 $NewLogs 设置为 $true(以使当前行之后的所有行都运行得更快),并传递线穿过管道。然后由于 $NewLogs 现在是 $true 所有超过该行的行都将通过管道。

$NewLogs = $false
Get-Content C:\Path\To\LogFile.txt -ReadCount 1000 |
    ForEach{
        If($NewLogs -or ($_ -match "(\S+day, \w+ \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{2} \w{2})" -and ([datetime]::ParseExact($Matches[1],"dddd, MMMM dd, yyyy h:mm:ss tt",$null)) -gt [datetime]::Now.AddHours(-3))){$NewLogs=$true;$_}
    }

然后您可以将其通过管道传输到 Set-Content 命令以输出到新文件,或者保持原样以在屏幕上显示它。如果是我,我可能会将最后一行更改为:

    } | Set-Content (join-path 'C:\Path\To\' ([datetime]::now.tostring('MMddyyhhmmtt.\tx\t')))

所以如果我现在这样做,它会将最近 3 小时的日志保存到文件中:

C:\Path\To15150359PM.txt

使用 TheMadTechnician 的解决方案,我在 Powershell v4 上得到了关于空数组的相同错误,但是做了以下工作:

记得将日期更改为

Thursday, July 16, 2015 8:44:03 PM
Thursday, July 16, 2015 8:44:04 PM

更新后的脚本:

$NewLogs = $false
$file = Get-Content C:\list.txt -ReadCount 1000

foreach ($line in $file)
{
    If($NewLogs -or ($line -match '(\S+day, \w+ \d{1,2}, \d{4} \d{1,2}:\d{1,2}:\d{2} \w{2})' -and ([datetime]::ParseExact($Matches[1],'dddd, MMMM dd, yyyy h:mm:ss tt',$null)) -gt [datetime]::Now.AddHours(-3)))
    {
        $NewLogs = $true
        $line
    }
}