web-dev-qa-db-ja.com

PowerShellと-contains演算子

次のスニペットを検討してください。

"12-18" -Contains "-"

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

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

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

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

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

103
tnw

-Contains演算子は部分文字列の比較を行わず、完全な文字列で一致する必要があり、コレクションの検索に使用されます。

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

-Contains Description:包含演算子。 参照値のコレクションに単一のテスト値が含まれるかどうかを通知します。

指定した例では、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演算子は- 正規表現 は、テキストのマッチングを実行します。

141
Kev

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

-matchおよび-imatch は正規表現の文字列マッチャーであり、キャプチャで使用する自動変数を設定します。

-like-ilikeはSQLに似たマッチャーです。

32
Eris

likeを使用できます。

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

またはsplitの場合はcontains

"12-18" -split "" -contains "-"
7
Esperento57
  • likeが最適、または少なくとも最も簡単です。
  • matchは、正規表現の比較に使用されます。

リファレンス: https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.core/about/about_comparison_operators?view=powershell-6

0
Maximojo