0

一部の XML ノード内のテキストを解析するために正規表現を使用しています。ただし、 with を使用する-SimpleMatchSelect-String、MatchInfo オブジェクトに一致が含まれていないように見えます。

この動作が正常であることを示すものをオンラインで見つけることができません。それが私のPowershellインストールであるかどうか疑問に思っています。(参考までに、私が使用しているコンピューターには Powershell 3.0 がインストールされています。)

非常に単純な例を使用すると、正規表現のパターン化を使用すると、予想される MatchInfo オブジェクトを返すことができます。

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

ただし、-SimpleMatchパラメーターを追加しても、MatchInfo オブジェクトの Matches プロパティは返されないようです。

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

PS H:\> $c.Matches

PS H:\>

MatchInfoオブジェクトが返されたこと$cを確認するためのパイプ:Get-Member

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;}                                        

パターンやラインワークなどのその他のプロパティ:

PS H:\> $c.Pattern
ab

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

また、インデックス値を Matches 配列に送信してもエラーは発生しません。

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

PS H:\> 

結果をどのように解釈すればよいか、また、なぜそれが起こっているのかはわかりません。

正規表現の特殊文字 () を含む文字列を何度も検索しなければならないため、この動作には問題があります。

例を拡張します。

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

PS H:\> $c.Matches

PS H:\> 

$c.Matches$c正規表現パターンで括弧を使用しているため、何も返さず、それ自体は null です。

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

を使用-SimpleMatchすると MatchInfo オブジェクトが生成されますが、一致するものは返されません。

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:\> 

私が見つけた回避策 (ここで SO) は、.NET から Regex.Escape メソッドを使用することです:
(参照: Powershell select-string fails due to escape sequence )

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)

この回避策により、期待される一致が から返されるSelect-Stringため、スクリプト作成を続行できました。

しかし、パラメーターを使用したときに一致が返されない理由が気になり-SimpleMatchます。

...
よろしく、
シュベルト

4

1 に答える 1

2

からGet-Help Select-String -Parameter SimpleMatch:

-SimpleMatch [ <SwitchParameter>]

正規表現の一致ではなく単純な一致を使用します。単純な一致では、Select-String は Pattern パラメーター内のテキストの入力を検索します。Pattern パラメーターの値を正規表現ステートメントとして解釈しません。

したがって、パイプする各文字列内SimpleMatchで部分文字列検索を行うだけです。文字列と関連するコンテキスト情報 (存在する場合) を含むオブジェクトを$Pattern返しますが、文字列に対して適切な正規表現マッチングが実行されていないため、返されません - それはそれと同じくらい単純ですMatchInfoMatches

于 2015-10-17T15:27:30.653 に答える