使用PowerShell解析MDT日志

时间:2018-10-09 12:19:20

标签: powershell parsing logging

我正在尝试设置一个日志,该日志将从另一个日志文件中提取不同的信息,以记录使用MDT使用PowerShell构建的资产。我可以使用简单的get-content | select-string提取一行日志来获取我需要的行,这样输出看起来就是

  

[LOG [验证域凭据[domain \ user]] LOG]!   time =“ 16:55:42.000 + 000” date =“ 10-20-2017” component =“ Wizard”   context =“” type =“ 1” thread =“” file =“向导”

我很好奇是否有一种方法可以在单独的变量中捕获域\用户,时间和日期等内容,以便以后可以将其以类似的方式与另一数据一起传递到输出文件中。

1 个答案:

答案 0 :(得分:0)

这是您可以执行的操作:

$line = Get-Content "<your_log_path>" | Select-String "Validate Domain Credentials" | select -First 1
$regex = '\[(?<domain>[^\\[]+)\\(?<user>[^]]+)\].*time="(?<time>[^"]*)".*date="(?<date>[^"]*)".*component="(?<component>[^"]*)".*context="(?<context>[^"]*)".*type="(?<type>[^"]*)".*thread="(?<thread>[^"]*)".*file="(?<file>[^"]*)"'
if ($line -match $regex) {
    $user = $Matches.user
    $date = $Matches.date
    $time = $Matches.time
    # ... now do stuff with your variables ...
}

您可能希望进行一些错误检查等操作(例如,当找不到行或不匹配时等)

如果只需要这三个值,则可以大大简化正则表达式。我对其进行了设计,以便包括该行中的所有字段。

此外,您可以将值转换为更合适的类型,(取决于之后要对它们进行的操作)可能会使处理起来更容易:

$type = [int]$Matches.type
$credential = New-Object System.Net.NetworkCredential($Matches.user, $null, $Matches.domain)
$datetime = [DateTime]::ParseExact(($Matches.date + $Matches.time), "MM-dd-yyyyHH:mm:ss.fff+000", [CultureInfo]::InvariantCulture)