PowerShell和-contains运算符


143

考虑以下代码段:

"12-18" -Contains "-"

您可能以为这是true,但不是。这将评估来false代替。我不知道为什么会这样,但是确实如此。

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

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

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

为什么第一个代码段的行为如此?有什么特别之处-不能很好地解决-Contains吗?该文档未提及任何内容。

Answers:


196

-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运算符使用正则表达式执行文本匹配。


14
为了完整起见,虽然-Match可能是一个很好的匹配,但它使用了正则表达式。如果要包含一个明确的字符串,则应按照操作说明进行检查:"12-18".Contains("-")
8DH 2016年

4
@ 8DH-​​非常好:)。重新阅读了该问题之后,我认为我需要澄清一下Containspowershell运算符和.Contains() .NET String方法之间的区别。
凯夫

1
正如上面评论中已经提到的,-Match使用正则表达式。这意味着string参数是一个正则表达式,而不是普通的字符串。例如,"hello" -Match "."将返回true,因为它"."是一个正则表达式,其中“。” 将匹配任何字符。要检查字符串是否包含句号:("hello" -Match "\."返回false)
malla

1
@malla-好的,我已经在注释中对此进行了编辑。谢谢。
凯夫

这肯定是一个“假朋友”!:)存在“ -contains”,意思是“属于列表”。
劳尔·萨利纳斯-蒙塔古多

38

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

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

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


13

您可以使用like

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

splitcontains

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.