Powershell: match operator returns true but $matches is null

后端 未结 2 1612
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-08 06:45

I am working with a regex to match file contents:

> (get-content $_) -match $somePattern
the line of text that matches the pattern

this

2条回答
  •  时光说笑
    2020-12-08 07:07

    Strictly speaking string -match ... and collection -match ... are two different operators. The first gets a Boolean value and fills $matches. The second gets each collection item that matches a pattern and apparently does not fill $matches.

    Your example should work as you expect if the file contains a single line (the first operator works). If a file contains 2+ lines then the second operator is used and $matches is not set.

    The same is true for other Boolean operators applied to a collection. That is collection -op ... returns items where item -op ... is true.

    Examples:

    1..10 -gt 5 # 6 7 8 9 10
    'apple', 'banana', 'orange' -match 'e' # apple, orange 
    

    Boolean operators applied to collections are handy if used properly. But they may be confusing as well and lead to easy to make mistakes:

    $object = @(1, $null, 2, $null)
    
    # "not safe" comparison with $null, perhaps a mistake
    if ($object -eq $null) {
        '-eq gets @($null, $null) which is evaluated to $true by if!'
    }
    
    # safe comparison with $null
    if ($null -eq $object) {
        'this is not called'
    }
    

    Another example with -match and -notmatch may look confusing:

    $object = 'apple', 'banana', 'orange'
    
    if ($object -match 'e') {
        'this is called'
    }
    
    if ($object -notmatch 'e') {
        'this is also called, because "banana" is evaluated to $true by if!'
    }
    

提交回复
热议问题