4

生成され、さまざまなファイル参照を含むレポート ファイルがあります。Select-String と正規表現を使用して、特定の種類のファイルを照合し、それらに対して後続の処理を実行しています。

私が抱えているジレンマは、一致がゼロ (0)、1 (1)、または複数 (2+) の場合に、一致の数を一貫して識別しようとすることです。これが私が試したことです:

(select-string -path $outputfilePath -pattern $regex -allmatches).matches.count

これは、一致が 0 件の場合は「null」、一致が 1 件の場合は「1」、複数の一致がある場合は「null」を返します。

(select-string -path $outputfilePath -pattern $regex -allmatches).count

これは、一致が 0 または 1 の場合は「null」を返し、複数の一致がある場合は一致の数を返します。


私はPowershellを初めて使用しますが、一致が0、1、または1を超えるかに関係なく、一致の数をテストする一貫した方法を見つけようとしています。

4

2 に答える 2

6

これを試して:

$content = Get-Content $outputfilePath
($content -match $regex).Count

Powershell には、多くの比較演算子があり、おそらく作業が楽になります。ここに簡単なリストがあります:

-eq
-ne
-gt
-ge   
-lt
-le
-Like
-NotLike
-Match
-NotMatch
-Contains
-NotContains
-In
-NotIn
-Replace

この例で-Matchは、 $content 文字列を正規表現 $regex と照合し、出力は括弧でグループ化されます。このグループ化は文字列のコレクションです。次に、オブジェクトをカウントし、一致の正確なカウントを出力できます。

では、なぜコードが期待どおりに機能しないのでしょうか? 単一の一致がある場合、.Matches実際には、文字列 "test123" に対して次のようなSystem.Text.RegularExpressions.Matchオブジェクトを返します。

Groups   : {test123}
Success  : True
Captures : {test123}
Index    : 15
Length   : 7
Value    : test123

なぜこれが起こるのですか?Microsoft.PowerShell.Commands.MatchInfoオブジェクトがSelect-String返されるためです。.Filenameこれは、単一一致の出力などの他のプロパティを試すことで確認できます。

わかりましたが、一度にすべてのマッチを取得できないのはなぜですか? これは、複数の一致が複数のオブジェクトを返すためです。これで、操作しようとしているコレクションができました。コレクションの型が異なり、理解できません.Matches。1 回の一致でコレクションが返されることはありませんが、代わりに理解できる単一のオブジェクトが返されます.Matches

簡単に言えば、これらはあなたが探している出力ではありません!

于 2013-09-04T20:50:12.273 に答える
2

配列部分式演算子@(...)を使用して、結果を常に次のコレクションに配置できCountます。

(Select-String ...)        # may return $null, one match, or a collection of matches
(Select-String ...).Count  # only succeeds for two or more matches

@(Select-String ...)       # always returns a collection of matches
@(Select-String ...).Count # always succeeds
于 2013-09-06T23:53:06.130 に答える