196

Consider the following snippet:

"12-18" -Contains "-"

You’d think this evaluates to true, but it doesn't. This will evaluate to false instead. I’m not sure why this happens, but it does.

To avoid this, you can use this instead:

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

Now the expression will evaluate to true.

Why does the first code snippet behave like that? Is there something special about - that doesn't play nicely with -Contains? The documentation doesn't mention anything about it.

4

4 回答 4

263

-Contains运算符不进行子字符串比较,并且匹配必须是完整的字符串,并且用于搜索集合。

从您链接到的文档中:

-包含描述:收容操作员。判断一组参考值是否包含单个测试值。

在您提供的示例中,您正在使用仅包含一个字符串项的集合。

如果您阅读链接到的文档,您将看到一个演示此行为的示例:

例子:

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

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

我认为你想要的是-Match运营商:

"12-18" -Match "-"

哪个返回True

重要提示:正如评论和链接文档中所指出的,应该注意-Match运算符使用正则表达式来执行文本匹配。

于 2013-09-18T16:38:32.840 回答
46

-Contains实际上是一个集合运算符。如果集合包含对象,则为 true。它不限于字符串。

-match并且-imatch是正则表达式字符串匹配器,并设置自动变量以与捕获一起使用。

-like,-ilike是类似 SQL 的匹配器。

于 2013-09-18T16:50:21.950 回答
26

您可以使用like

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

splitcontains

"12-18" -split "" -contains "-"
于 2016-11-15T12:03:20.973 回答
1
  • like是最好的,或者至少是最简单的。
  • match用于正则表达式比较。

参考:关于比较运算符

于 2019-05-02T00:31:49.597 回答