Строго говоря, string -match ...
и collection -match ...
- это два разных оператора.Первый получает логическое значение и заполняет $matches
.Второй получает каждый элемент коллекции, который соответствует шаблону и, очевидно, не заполняет $matches
.
Ваш пример должен работать так, как вы ожидаете, если файл содержит одну строку (первый оператор работает).Если файл содержит 2+ строки, то используется второй оператор и $matches
не задан.
То же самое верно для других логических операторов, применяемых к коллекции.То есть collection -op ...
возвращает элементы, для которых item -op ...
имеет значение true.
Примеры:
1..10 -gt 5 # 6 7 8 9 10
'apple', 'banana', 'orange' -match 'e' # apple, orange
Логические операторы, применяемые к коллекциям, удобны при правильном использовании.Но они также могут сбивать с толку и приводить к легким ошибкам:
$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'
}
Другой пример с -match
и -notmatch
может показаться запутанным:
$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!'
}