【问题标题】:PowerShell and the -contains operatorPowerShell 和 -contains 运算符
【发布时间】:2026-01-31 15:35:01
【问题描述】:

考虑以下 sn-p:

"12-18" -Contains "-"

您可能认为它的计算结果为 true,但事实并非如此。这将改为 false。我不确定为什么会发生这种情况,但确实如此。

为避免这种情况,您可以改用它:

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

现在表达式将评估为真。

为什么第一个代码 sn-p 的行为是这样的? - 有什么特别之处不能与 -Contains 配合得很好吗? The documentation 没有提及它。

【问题讨论】:

    标签: powershell operators string-matching


    【解决方案1】:

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

    来自您链接到的文档:

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

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

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

    例子:

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

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

    "12-18" -Match "-"
    

    返回True

    重要提示:正如 cmets 和 linked documentation 中所指出的,需要注意的是,-Match 运算符使用 regular expressions 来执行文本匹配。

    【讨论】:

    • 为了完整起见,虽然 -Match 可能是一个很好的匹配,但它使用正则表达式。如果想要一个明确的字符串包含检查一个应该做的 OP 描述:"12-18".Contains("-")
    • @8DH - 非常好:)。重新阅读问题后,我想我需要澄清Contains powershell 运算符和.Contains() .NET String 方法之间的区别。
    • 正如上面评论中已经提到的,-Match 使用正则表达式。这意味着字符串参数是正则表达式,而不是普通字符串。例如,"hello" -Match "." 将返回 true,因为 "." 是一个正则表达式,其中一个 '.'将匹配任何字符。检查字符串是否包含句号:"hello" -Match "\."(返回 false)
    • 这绝对是个“假朋友”! :) “-contains”的存在意味着“属于一个列表”。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      你可以使用like:

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

      splitcontains

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

      【讨论】:

        【解决方案4】:
        • like 是最好的,或者至少是最简单的。
        • match 用于正则表达式比较。

        参考:About Comparison Operators

        【讨论】: