假设我在变量$ mat中调用Select-String的结果,从文件内容中解析正则表达式:
$mat = cat errors.txt | Select-String "'(?<code>\w+)'.+ID (?<id>[^:]+)" 
根据$mat | Get-Member结果的输出包含类型的Matches属性Match[].
当我执行以下操作时,我获得了正则表达式输出的所有匹配:
PS > $mat | Select-Object -Property Matches
Matches                                                                                                                                                                              
-------                                                                                                                                                                              
{'ACCFWD', ID 16}                                                                                                                                                                    
{'EQASIAN', ID 448}                   
为什么下一个使用foreach选择匹配的代码块没有相同的输出:
    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
谢谢!
显示属性时,PowerShell会自动格式化不具有*.format.ps1xml文件中定义的显示格式的类型的属性,作为最多4个属性的表.5个或更多属性显示为列表.当您选择Matches属性时Select-Object,您正在选择Microsoft.PowerShell.Commands.MatchInfo对象的单个属性.随着Foreach-Object您显示System.Text.RegularExpressions.Match对象的所有属性.
使用Select-Object -ExpandProperty Matches将导致输出看起来与Foreach它相同,因为它将输出RegularExpressions.Match对象.
如果放在Get-Member产生输出的两个示例之后,您将看到它们输出不同类型的对象.
编辑:以下是每个命令的格式说明.
cat errors.txt | Select-String "'(?<code>\w+)'.+ID (?<id>[^:]+)"
输出Select-String是一个Microsoft.PowerShell.Commands.MatchInfo具有8个属性的对象.因为显示格式为这些属性默认不显示MatchInfo被定义在PowerShellCore.format.ps1xml显示的结果MatchInfo的ToString()方法.
$mat | Select-Object -Property Matches
在这种情况下,输出Select-Object是具有从对象复制Selected.Microsoft.PowerShell.Commands.MatchInfo的Matches属性的自定义MatchInfo对象.由于没有为Selected.Microsoft.PowerShell.Commands.MatchInfo类型定义默认显示格式,因此PowerShell会将其格式化为表格,因为它具有少于5个属性(在这种情况下Matches是唯一的属性).
$mat | ForEach { $_.Matches } 
在Foreach-ObjectScriptBlock中,正在输出对象的Matches属性MatchInfo.该Matches酒店System.Text.RegularExpressions.Match有6处场所.由于没有为System.Text.RegularExpressions.Match类型定义默认显示格式,因此Match对象显示为列表,因为有超过4个属性.