PowerShellと-contains演算子


143

次のスニペットを考えてみましょう:

"12-18" -Contains "-"

これはと評価されると思いますtrueが、そうではありません。これはfalse代わりに評価されます。なぜこれが起こるのかはわかりませんが、実際に起こります。

これを回避するには、代わりにこれを使用できます。

"12-18".Contains("-")

これで、式はtrueと評価されます。

最初のコードスニペットがそのように動作するのはなぜですか?-うまくいかない特別なものはあり-Containsますか?ドキュメントには、それについては何も言及していません。

回答:


196

-Containsオペレータは、サブストリングの比較を行わないと、試合は完全な文字列でなければなりませんし、コレクションを検索するために使用されます。

リンクしたドキュメントから:

-Contains説明:包含演算子。参照値のコレクションに単一のテスト値が含まれているかどうかを判断します。

指定した例では、文字列アイテムを1つだけ含むコレクションを操作しています。

リンクしたドキュメントを読むと、この動作を示す例が表示されます。

例:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

あなたが欲しいのは-Match演算子だと思います:

"12-18" -Match "-"

どちらが戻るかTrue

重要:コメントとリンクされたドキュメントで指摘されているように、-Matchオペレーターは正規表現を使用してテキストマッチングを実行することに注意してください。


14
完全を期すために、-Matchは良い一致かもしれませんが、正規表現を使用しています。1が欲しい場合は明確な文字列はOPで説明するよう1が何をすべきチェック含まれています"12-18".Contains("-")
8DH

4
@ 8DH-​​非常に良いキャッチ:)。質問をContainsもう一度読んだので、Powershellオペレーターと.Contains() .NET Stringメソッドの違いを明確にする必要があると思います
Kev 2016年

1
上記のコメントですでに述べたように、-Match正規表現を使用します。つまり、文字列パラメーターは正規表現であり、通常の文字列ではありません。たとえば、"hello" -Match ".""."正規表現である「。」であるため、trueを返します。任意の文字に一致します。文字列にフルストップが含まれているかどうかを確認するには:"hello" -Match "\."(falseを返します)
malla

1
@malla-良い点、私はこれに関するメモで編集しました。ありがとう。
Kev

これは確かに「偽の友達」です!:)「リストに属する」ことを意味する「-contains」の存在。
ラウル・サリナス- Monteagudo

38

-Contains実際にはコレクション演算子です。コレクションにオブジェクトが含まれている場合はtrueです。文字列に限定されません。

-matchそして-imatchキャプチャで使用する正規表現文字列の整合器、およびセット自動変数です。

-like-ilikeSQLに似たマッチャーです。


13

使用できますlike

"12-18" -like "*-*"

またはsplitのためにcontains

"12-18" -split "" -contains "-"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.