PowerShell和-contains运算符

考虑下面的代码片段:

"12-18" -Contains "-" 

你会认为这是true ,但事实并非如此。 相反,这将评估为false 。 我不知道为什么会发生这种情况,但确实如此。

为了避免这种情况,你可以使用它来代替:

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

现在expression式将评估为true。

为什么第一个代码片段的行为如此? 有没有什么特别的东西-那和-Contains打得不好? 文档没有提到任何关于它的事情。

-Contains运算符不会进行子string比较,匹配必须位于完整的string上,并用于search集合。

从您链接到的文档:

– 包含
说明:遏制运营商。 告诉参考值的集合是否包含单个testing值。

在你提供的例子中,你正在处理一个只包含一个string项目的集合。

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

例子:

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

我想你想要的是-Match运算符:

 "12-18" -Match "-" 

其中返回True

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

-match-imatch是正则expression式string匹配器,并设置自动variables以用于捕获。

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

你可以使用like

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

split contains

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