Вот как вы могли бы это сделать:
$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 ...
}
Возможно, вы захотите встроить некоторую проверку ошибок и т. Д. (Например, когда строка не найдена или не совпадает и т. Д.)
Также вы можете значительно упростить регулярное выражение, если вам нужны только эти 3 значения.Я разработал его так, чтобы все поля из строки были включены.
Кроме того, вы можете преобразовать значения в более подходящие типы, что (в зависимости от того, что вы хотите с ними делать впоследствии) может упростить их обработку:
$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)