PowerShell-contains-like

Kiedy ludzie eksplorują operatory dostępne w PowerShell (pomoc o_comparison_operators), często natkną się na dwa podobne – pozornie, ale drastycznie różne, operatory-i będą się przez nie mylić.

często widzę, że ktoś próbuje tego:

if ($string -contains '*win*') { }

próbuje sprawdzić, czy $string zawiera litery „win”, ale niestety nie to robi-contains. To, czego tak naprawdę chcą użyć, to operator podobny:

if ($string-like '*win*’) {}

wiem, że nie czyta się tak ładnie, gdy mówisz to na głos. Brzmi jak dziewczyna z Doliny. „Jeśli ta zmienna, jak, jest jak, wiesz, ta dzika karta, omigod, jak naprawdę?”Ale-jak jest właściwym operatorem do tego zadania.

operator-contains jest nieco trudniejszy. Jest zaprojektowany, aby powiedzieć, czy zbiór obiektów zawiera („zawiera”) konkretny obiekt. Teraz, jeśli twój zbiór obiektów jest zbiorem łańcuchów, jest to dość proste.

$coll = "one','two','three','four'if ($coll -contains 'one') { }

trudniej jest, gdy Kolekcja zawiera złożone obiekty. To nie zadziała tak, jak myślisz:

$coll = Get-Service
if ($coll-contains 'BITS’) { }

zmienna $coll nie zawiera łańcucha „BITS;” zawiera obiekt service, którego właściwością Name jest BITS. Nie można tak naprawdę użyć-contains, ponieważ porównuje cały obiekt. Na przykład:

# Pobierz wszystkie procesy
$procs = Get-Process

# Pobierz tylko jeden proces
$proc = Get-Process | Select-pierwszy 1

# Sprawdź
$procs-zawiera $proc

To prawie zawsze będzie fałszywe. Dzieje się tak dlatego, że w czasie, jaki zajmuje uruchomienie drugiego polecenia, pierwszy proces się zmienił. Jego pamięć, procesor lub inna wartość uległy zmianie. Chociaż $procs zawiera ten sam rzeczywisty proces co $proc, nie każda pojedyncza właściwość jest dokładnie taka sama w obu instancjach. So-contains nie może wykryć dopasowania.

Dowiedz się więcej o ” Top Ten PowerShell.”

chcesz zadać pytanie dotyczące tego artykułu? Odpowiem na http://powershell.com/cs/forums/230.aspx!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *