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 "-"