Dot-Net

PowerShell -match 運算符和多個組

  • June 18, 2021

我有以下在 PowerShell 中處理的日誌條目我正在嘗試使用-match運算符提取所有活動名稱和持續時間,但我只得到一個匹配組。當我在 C# 中使用該對像做同樣的事情時,我並沒有得到我看到的所有匹配項Regex。有人可以解釋我做錯了什麼嗎?

相關 PowerShell 腳本

$formattedMessage -match "(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)" | out-null
$matches

輸出

Name  Value
----  -----
0     Get Client Model - duration(0
1     Get Client Model
2     0

日誌條目範例:

Timestamp: 11/9/2009 6:48:41 PM
Message:
Category: QueryService
Priority: 3
EventId: 1001
Severity: Information
Title: SPARQL Query Response
Machine: SPOON16-SERVER
App Domain: KnowledgeBaseHost.exe
ProcessId: 2040
Process Name: D:\QueryService\QSHost.exe
Thread Name:
Win32 ThreadId:8092
Extended Properties:
Key - Workflow_cbbdd58b-e574-4054-88d4-1dd7a56dc9d9
Timeout - 1800
Result Format - WireTable
Result from Registry - False
Compiled Query from Cache - True
Result Count - 28332
Query Plan Complexity - 661622
Get Client Model - duration(0) start(0)
Parse Expression - duration(0) start(0)
Get Abstract Query - duration(0) start(0)
Compile Query - duration(0) start(0)
Get Query Plan - duration(0) start(1)
Execute Query - duration(63695) start(1)
Get Query Plan Complexity - duration(0) start(63696)
Get Executed Operations - duration(0) start(63696)
Total - duration(63696) start(0)
Async Total - duration(63696) start(0)

您可以使用 V2 中的Select-String cmdlet 執行此操作,但您需要指定*-AllMatches*開關,例如:

$formattedMessage | Select-String 'regexpattern' -AllMatches

請記住,對於-match運算符,您所做的主要事情是尋找“a”匹配,即正則表達式模式是否匹配?

我能夠通過定義一個正則表達式然後在該正則表達式上呼叫*.Matches來獲得所有組。我仍然很想知道這是否可以使用PowerShell 中的-match運算符來完成。*

$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)

引用自:https://stackoverflow.com/questions/1703061