You can do this with the Select-String cmdlet in V2 but you need to specify the -AllMatches switch e.g.:
$formattedMessage | Select-String 'regexpattern' -AllMatches
Keep in mind that with the -match
operator the primary thing you are doing is looking for "a" match i.e. is the regex pattern matched or not.
Мне удалось получить все группы, определив Regex и затем вызвав .Matches для этого Regex. Все еще любопытно узнать, можно ли это сделать с помощью оператора -match в PowerShell.
$detailRegex = [regex]"(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)"
$detailRegex.Matches($formattedMessage)
Оператор -match предназначен для использования только один раз; он не выполняет глобального сопоставления на входе. Кейт Хилл предложил использовать оператор -matchall в Microsoft connect здесь .
Я предлагаю другой способ сделать это. Если запись журнала находится в файле, вы можете использовать оператор switch для выполнения той же задачи:
switch -regex -file .\log.txt { $entryRegex { $matches[1] + ", " + $matches[2] } }
Это результат, который я получаю с помощью этого оператора, если $ entryRegex
имеет определенное вами регулярное выражение:
Get Client Model, 0
Parse Expression, 0
Get Abstract Query, 0
Compile Query, 0
Execute Query, 63695
Get Query Plan Complexity, 0
Total, 63696
Async Total, 63696
http://www.johndcook.com/regex.html gives a decent example
And, by all means, simplify your expression:
^([^-]+)\s*-\s*duration\(([0-9]+)