假设我有一个变量 $mat,其中包含调用 Select-String 函数并从文件内容中解析正则表达式的结果:
根据
当我执行以下代码时,会输出正则表达式所有的匹配项:
$mat = cat errors.txt | Select-String "'(?<code>\w+)'.+ID (?<id>[^:]+)"
根据
$mat | Get-Member
的输出,结果包含了一个类型为Match[]
的匹配属性。当我执行以下代码时,会输出正则表达式所有的匹配项:
PS > $mat | Select-Object -Property Matches
Matches
-------
{'ACCFWD', ID 16}
{'EQASIAN', ID 448}
为什么使用foreach选择Matches的下一个代码块输出不同:
PS > $mat | ForEach { $_.Matches }
Groups : {'ACCFWD', ID 16, ACCFWD, 16}
Success : True
Captures : {'ACCFWD', ID 16}
Index : 20
Length : 15
Value : 'ACCFWD', ID 16
Groups : {'EQASIAN', ID 448, EQASIAN, 448}
Success : True
Captures : {'EQASIAN', ID 448}
Index : 20
Length : 17
Value : 'EQASIAN', ID 448
help Select-Object
,您将看到“它会复制输入对象的这些属性的值,并创建具有指定属性和已复制值的新对象。” 如果您使用-ExpandProperty
,它将输出该属性类型的对象。 - Rynant*.format.ps1xml
文件了。我已经更新了回答,并解释了每个输出的含义。希望现在更清楚了。 - RynantMatch[]
(一个Match
数组)。但是当数组通过Powershell管道发送时,它们通常会一次发送一个元素。所以管道下游的命令将接收到一个Match
对象,而不是整个Match[]
数组。执行$m ='test'| Select-String test
。然后,$m.Matches.GetType()
将结果为Match[]
,而$m.Matches|gm
将结果为Match
。 - Rynant