PowerShell-contains-like

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!

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *