从文本文件中解析日期并提取日期大于X

时间:2016-01-21 04:22:46

标签: powershell

我的客户使用第三方软件存储机密医疗信息。我们现在需要找出哪些用户在数据库中打开了特定记录。我与供应商保持联系,他们记录的唯一方法是在每台计算机上的文本文件中(显然)。我需要从每台计算机解析这个文本文件,以提取我需要的信息。以下是文本文件中信息的匿名示例 - 为了便于阅读,我在每一行之间添加了空格。

登录。| 10/03/2012 | 01:12:45 | John Smith博士| 3 | FS01 |带终端服务Service Pack 1的Windows 7域控制器(6.1 Build 7601)| 3.12.1 < /强>

进度记录 - 新记录开启| 10/03/2012 | 01:13:33 | John Smith博士| 666241 | 8463 | Richard Test ^ 05/09 / 1956 | .F。| .T。| 1 | FS01

进度记录 - 由用户放弃| 10/03/2012 | 01:14:29 | John Smith博士| 666241 | 8463 | Richard Test | .F。| .T。| FS01 < / p>

我可以轻松地删除任何有关记录名称的行,即“理查德测试”,但这些日志一直追溯到2012年。有没有人知道如何解析每行的日期以便我例如,在2016年1月1日之后可以拉什么东西吗?

import-module activedirectory
$computers = "FS01"#get-adcomputer -filter * | Select-object -ExpandProperty Name

foreach($computer in $computers){

$path = "\\$computer\C$\Users\Public\Documents\HCN\MD\MDTrace.LOG"
If(Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue){
If(Test-Path $Path){
Get-Content -Path $path | foreach { if($_ -match "Thomas Hogan"){Write-Output "$computer -- $_"} }
}
}
}

2 个答案:

答案 0 :(得分:1)

使用正则表达式提取日期,例如:

$cutoff = Get-Date -Year 2013 -Month 1 -Day 1
Get-Content .\log.txt | ? {
    $g = [regex]::Match($_, '(\d\d)/(\d\d)/(\d\d\d\d)').Groups
    (Get-Date -Year $g[3].Value -Month $g[2].Value -Day $g[1].Value) -gt $cutoff 
} | Out-File filtered_log.txt

如果文件很大,那么这种方法可能会更快:

$cutoff = Get-Date -Year 2013 -Month 1 -Day 1
Get-Content .\log.txt -ReadCount 1 | % {
    $_ | ? {
        $g = [regex]::Match($_, '(\d\d)/(\d\d)/(\d\d\d\d)').Groups

        (Get-Date -Year $g[3].Value -Month $g[2].Value -Day $g[1].Value) -gt $cutoff 
    } | Out-File filtered_log.txt -Append
}

答案 1 :(得分:0)

我在试验和错误后发现我可以在这种情况下拆分,因为它们总是被|

分开
$computers = "NB04TMPL" #Get-Content D:\computers.txt | Sort-Object
$date = "21/01/2013"
$name = "Richard Test"
foreach ($computer in $computers)
{
    $path = "C:\temp\MDTrace.LOG"
    If (Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue)
    {
        If (Test-Path $Path)
        {
            Get-Content -Path $path | foreach {
                $str = ($_ -split '\|')
                if ($str[1] -gt $date)
                {
                    if ($str[6] -match $name)
                    {
                        Write-Output $_
                    }
                }
            }   
        }   
    }
}

热衷于听到任何想法。我不确定这是如何与RegEx叠加的。我想RegEx会让我获得更多的灵活性和更少的If