Wykonuję:
$query = logman query -s server01
W zmiennej $query pojawia się:
Collection Type Status --------------------------------------------------------------- XXXXX Counter Stopped YYYYY Counter Running System Overview Counter Stopped capacity Counter Running
Teraz chcę sprawdzić czy w $query jest chociaż jeden napis, który zawiera w sobie tekst „capacity”. Rozsądne wydawałoby się:
$query -contains 'capacity’
… ale wynik to $false ! Dlaczego!? Oto odpowiedż:
Get-Help about_Comparison_Operators -showwindow
When the test value is a collection, the Contains operator uses reference
equality. It returns TRUE only when one of the reference values is the same
instance of the test value object.
Syntax:
<Reference-values> -Contains <Test-value>
Examples:
PS C:\> „abc”, „def” -Contains „def”
True
PS C:\> „Windows”, „PowerShell” -Contains „Shell”
False #Not an exact match
Teraz po naszemu – jeżeli -contains ma sprawdzić kolekcję elementów (a $query to kolekcja napisów), to sprawdza czy w danej kolekcji występuje chociaż jeden element dokładnie równy „capacity”. A takiego nie ma więc wynik to $false….
Jak to obejść? Proponuję takie polecenie:
$query | % -Begin {$result = $false} -Process { if($_.Contains(’capacity’)) { $result = $true } } -End { return $result }
Czyli krok po kroku:
- Na początku definiujemy zmienną $result o wartości $false (to jest blok Begin)
- Następnie dla każdego wiersza odbywa się sprawdzenie czy ten wiersz zawiera napis 'capacity’ (to jest blok Process). Jeżeli taki wiersz zostanie znaleziony to wartość zmiennej $result jest ustawiana na $true, ale nic nie jest jeszcze zwrócone.
- I wreszcie na końcu jest zwracana wartość z $result (to jest blok End).
Komentarze:
Pomógłby operator -match:
PS C:\> 'PowerShell’ -match 'Shel’
True