一部の XML ノード内のテキストを解析するために正規表現を使用しています。ただし、 with を使用する-SimpleMatch
とSelect-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
ます。
...
よろしく、
シュベルト