Kun ihmiset tutkivat powershellissa saatavilla olevia operaattoreita (help about_ comparison_operators), he törmäävät usein kahteen samanlaiseen-näennäiseen, mutta rajusti erilaiseen operaattoriin – ja hämmentyvät niistä.
näen usein jonkun yrittävän tätä:
if ($string -contains '*win*') { }
he yrittävät nähdä, sisältääkö $string kirjaimet ”win”, mutta valitettavasti se ei ole mitä-Sisältää ei. Mitä he todella haluavat käyttää on-kuten operaattori:
if ($string-like ’*win*’) {}
tiedän, ettei se lukeudu yhtä kauniisti, kun sen sanoo ääneen. Kuulostaa laakson tytöltä. ”Jos tämä muuttuja, kuten, tiedäthän, tämä jokerimerkki, omigod, niinku oikeasti?”Mutta-like on oikea operaattori tähän tehtävään.
– sisältää operaattori on hieman hankalampi. Se on suunniteltu kertomaan, jos kokoelma esineitä sisältää (’sisältää’) tietyn objektin. Nyt, jos kokoelma esine on joukko merkkijonoja, tämä on melko yksinkertainen.
$coll = "one','two','three','four'if ($coll -contains 'one') { }
se vaikeutuu, kun kokoelma sisältää monimutkaisia esineitä. Tämä ei toimi kuten voisi luulla:
$coll = Get-Service
jos ($coll-sisältää ’bitit’) {}
muuttuja $coll ei sisällä merkkijonoa ”bitit”; se sisältää palveluobjektin, jonka Nimiomaisuus on bitit. Et voi todella käyttää-sisältää tällä tavalla, koska se vertaa koko objektin. Esimerkiksi:
# Get all process
$procs = Get-Process
# Get just one process
$proc = Get-Process/Select-first 1
# Check it
$procs-contains $proc
Tämä on lähes aina epätosi. Se johtuu siitä, että toisen komennon suorittamiseen kuluvassa ajassa ensimmäinen prosessi on muuttunut. Sen muisti, suoritin tai jokin muu arvo on muuttunut. Vaikka $procs sisältää saman todellisen prosessin kuin $proc, ei jokainen ominaisuus ole täsmälleen sama molemmissa tapauksissa. So-containes ei tunnista vastaavuutta.
Lue lisää ”Top Ten PowerShell Annoyances.”
Haluatko esittää kysymyksen tästä artikkelista? Vastaan http://powershell.com/cs/forums/230.aspx!