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!