PowerShell和-contains运算符

PowerShell and the -contains operator

考虑以下代码段:

1
"12-18" -Contains"-"

您可能以为这是true,但不是。 它将取值为false。 我不确定为什么会这样,但是确实如此。

为了避免这种情况,您可以改用以下方法:

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

现在,表达式将评估为true。

为什么第一个代码段的行为如此? -有什么与-Contains搭配不好的东西吗? 该文档未提及任何内容。


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

从您链接到的文档中:

-Contains
Description: Containment operator. Tells whether a collection of reference values includes a single test value.

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

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

例子:

1
2
3
4
5
PS C:\>"abc","def" -Contains"def"
True

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

我认为您想要的是-Match运算符:

1
"12-18" -Match"-"

返回True

重要说明:正如注释和链接文档中指出的那样,应注意-Match运算符使用正则表达式执行文本匹配。


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

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

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


您可以使用like

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

split表示contains

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

  • like是最好的,或者至少是最简单的。
  • match用于正则表达式比较。

参考:https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6