når folk utforsker operatørene som er tilgjengelige I PowerShell (help about_comparison_operators), vil de ofte løpe over to lignende tilsynelatende, men drastisk forskjellige operatører-og bli forvirret av dem .
jeg ser ofte noen prøve dette:
if ($string -contains '*win*') { }
De prøver å se om $string inneholder bokstavene «vinn», men dessverre er det ikke hva-inneholder gjør. Hva de virkelig ønsker å bruke er-lignende operatør:
hvis ($string-like ‘*win*’) {}
jeg vet at det ikke leser så pent når du sier det høyt. Høres Litt Valley Jente, antar jeg. «Hvis, som, denne variabelen, som, er som, du vet, dette wildcard, omigod, som virkelig?»Men-som er riktig operatør for denne oppgaven .
den-inneholder operatøren er litt vanskeligere. Den er designet for å fortelle deg om en samling objekter inneholder (‘inneholder’) et bestemt objekt. Nå, hvis samlingen av objektet er en haug med strenger, dette er ganske grei.
$coll = "one','two','three','four'if ($coll -contains 'one') { }
det blir vanskeligere når samlingen inneholder komplekse objekter. Dette vil ikke fungere som du kanskje tror:
$coll = Get-Service
hvis ($coll-inneholder «BITS») {}
variabelen $coll inneholder ikke strengen «BITS»; hva den inneholder er et tjenesteobjekt Hvis Navnegenskap ER BITS. Du kan egentlig ikke bruke-inneholder på denne måten, fordi den sammenligner hele objektet. Eksempelvis:
# Få alle prosesser
$procs = Get-Process
# Få bare en prosess
$proc = Get-Process/Select-first 1
# Sjekk det
$procs-inneholder $proc
Dette vil nesten Alltid Være Falsk. Det er fordi, i tiden det tar å kjøre den andre kommandoen, har den første prosessen endret seg. Dens minne, CPU eller annen verdi har endret seg. Selv om $procs inneholder samme faktiske prosess som $proc, er ikke hver eneste egenskap nøyaktig den samme i begge tilfeller. Så-inneholder kan ikke oppdage kampen.
Lær mer om » Topp Ti Powershell Irritasjonsmomenter.»
Vil du stille et spørsmål om denne artikkelen? Jeg svarer på http://powershell.com/cs/forums/230.aspx!