Corresponde não capturada ao usar o '- SimpleMatch ' com o Select-String

tenho usado a expressão regular para processar o texto dentro de alguns nós XML. No entanto, quando eu uso -SimpleMatch com Select-String, O Objeto MatchInfo não parece conter nenhuma correspondência.

Não consigo encontrar nada online que indique que este comportamento é normal. Pergunto-me agora se é a minha instalação Powershell. (Para referência: o computador que estou usando tem Powershell 3.0 instalado.)

usando um exemplo muito simples, podemos devolver o objeto MatchInfo esperado ao usar a expressão regular patterning:

PS H:\> $c = "abd 14e 568" | Select-String -Pattern "ab"

PS H:\> $c.Matches


Groups   : {ab}
Success  : True
Captures : {ab}
Index    : 0
Length   : 2
Value    : ab

mas a adição do parâmetro -SimpleMatch parece não devolver a propriedade correspondente no objecto MatchInfo:

PS H:\> $c = "abd 14e 568" | Select-String -Pattern "ab" -SimpleMatch

PS H:\> $c.Matches

PS H:\>

Piping $c to Get-Member confirma que um objecto MatchInfo foi devolvido:

PS H:\> $c | gm


   TypeName: Microsoft.PowerShell.Commands.MatchInfo

Name         MemberType Definition                                                       
----         ---------- ----------                                                       
Equals       Method     bool Equals(System.Object obj)                                   
GetHashCode  Method     int GetHashCode()                                                
GetType      Method     type GetType()                                                   
RelativePath Method     string RelativePath(string directory)                            
ToString     Method     string ToString(), string ToString(string directory)             
Context      Property   Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
Filename     Property   string Filename {get;}                                           
IgnoreCase   Property   bool IgnoreCase {get;set;}                                       
Line         Property   string Line {get;set;}                                           
LineNumber   Property   int LineNumber {get;set;}                                        
Matches      Property   System.Text.RegularExpressions.Match[] Matches {get;set;}        
Path         Property   string Path {get;set;}                                           
Pattern      Property   string Pattern {get;set;}                                        

e outras propriedades, tais como padrões e trabalhos em Linha:

PS H:\> $c.Pattern
ab

PS H:\> $c.Line
abd 14e 568

além disso, não é gerado nenhum erro ao enviar um valor de índice para a matriz de correspondências:

PS H:\> $c.Matches[0]

PS H:\> 
Não sei como interpretar os resultados, nem sei porque é que é ocorrer.

Este comportamento é problemático, pois há muitas vezes que devo procurar por cadeias que contêm caracteres especiais regex, () ' s são muito comuns.

Expansion on the example:

PS H:\> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)"

PS H:\> $c.Matches

PS H:\> 

$c.Matches não devolve nada, e o $c em si é nulo, devido ao uso dos parêntesis no padrão regex:

PS H:\> $c -eq $null
True

o uso de -SimpleMatch produz um objecto MatchInfo, mas ainda assim não devolve nenhuma correspondência:

PS H:\> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)" -SimpleMatch

PS H:\> $c -eq $null
False

PS H:\> $c.Matches

PS H:\> 

o trabalho que encontrei (aqui em SO) é para usa a Regex.Método de fuga de .NET:
(referência: O select-string Powershell falha devido à sequência de escape)

PS H:\> $pattern = "ab(d)"
$pattern = ([regex]::Escape($pattern))
$c = "ab(d) 14e 568" | Select-String -Pattern $pattern

PS H:\> $c.Matches


Groups   : {ab(d)}
Success  : True
Captures : {ab(d)}
Index    : 0
Length   : 5
Value    : ab(d)

à medida que este trabalho retorna as correspondências esperadas de Select-String, eu fui capaz de continuar o meu scripting.

mas estou curioso por saber porque é que não são devolvidos fósforos ao usar o parâmetro -SimpleMatch.

...
Com respeito,
Schwert

Author: Community, 2015-10-17

1 answers

De Get-Help Select-String -Parameter SimpleMatch:

-SimpleMatch [<SwitchParameter>]

Usa uma correspondência simples em vez de uma correspondência de expressão regular. Em uma correspondência simples, Select-String procura a entrada para o texto no parâmetro padrão. não interpreta o valor do parâmetro padrão como uma declaração de expressão regular.

Então, SimpleMatch simplesmente faz uma busca em substring de $Pattern dentro de cada string que você encaminha para ele. Devolve um objecto MatchInfo que contém o texto e é relevante informação contextual se presente, mas não Matches uma vez que uma correspondência regular adequada nunca foi realizada contra a cadeia de caracteres - é tão simples como isso

 1
Author: Mathias R. Jessen, 2015-10-17 15:27:30