Ściśle mówiąc string -match ...
i collection -match ...
to dwa różne operatory. Pierwszy dostaje wartość typu Boolean i wypełnia $matches
. Po drugie każdy element kolekcji pasuje do wzorca i najwyraźniej nie wypełnia $matches
.
Twój przykład powinien działać zgodnie z oczekiwaniami, jeśli plik zawiera pojedynczą linię (działa pierwszy operator). Jeśli plik zawiera 2 wiersze, używany jest drugi operator i $matches
nie jest ustawiony.
To samo dotyczy innych operatorów Boolean zastosowanych do kolekcji. To jest collection -op ...
zwraca pozycje, w których item -op ...
jest prawdziwe.
Przykłady:
1..10 -gt 5 # 6 7 8 9 10
'apple', 'banana', 'orange' -match 'e' # apple, orange
operatorów logicznych stosowane do zbiorów są przydatne, jeśli są prawidłowo stosowane. ale mogą być mylące, jak również i doprowadzić do łatwo popełnić błędy:
$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'
}
Innym przykładem z -match
i -notmatch
może wyglądać mylące:
$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!'
}
Pokaż przykład z rzeczywistych danych - listy regex i dopasowany tekst. – tripleee