Powershell: Contains nie działa!

5-sie-2014

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:

  1. chojrak napisał,

    Pomógłby operator -match:
    PS C:\> 'PowerShell’ -match 'Shel’
    True

Autor: Rafał Kraik