När folk utforskar operatörerna som finns i PowerShell (hjälp about_comparison_operators), kommer de ofta att springa över två liknande, men drastiskt olika operatörer-och bli förvirrade av dem.
Jag ser ofta någon prova detta:
if ($string -contains '*win*') { }
de försöker se om $string innehåller bokstäverna” win”, men tyvärr är det inte vad-innehåller gör. Vad de verkligen vill använda är-liknande operatör:
if ($string-like ’ * win*’) {}
Jag vet att det inte läser lika bra när du säger Det högt. Låter ganska Valley Girl, antar jag. ”Om, som, denna variabel, som, är som, du vet, detta jokertecken, omigod, som verkligen?”But-like är rätt operatör för denna uppgift.
operatören-innehåller är lite svårare. Den är utformad för att berätta om en samling objekt innehåller (’innehåller’) ett visst objekt. Nu, om din samling av objekt är en massa strängar, är det ganska enkelt.
$coll = "one','two','three','four'if ($coll -contains 'one') { }
det blir svårare när samlingen innehåller komplexa objekt. Det här fungerar inte som du kanske tror:
$coll = Get-Service
om ($coll-innehåller ”bitar”) {}
variabeln $coll innehåller inte strängen ”bitar;” vad den innehåller är ett serviceobjekt vars namnegenskap är bitar. Du kan inte riktigt använda-Innehåller på detta sätt, eftersom det jämför hela objektet. Exempelvis:
# få alla processer
$procs = Get-Process
# få bara en process
$proc = Get-Process / Select-första 1
# kontrollera det
$procs-innehåller $proc
detta kommer nästan alltid att vara falskt. Det beror på att den första processen har ändrats under den tid det tar att köra det andra kommandot. Dess minne, CPU eller något annat värde har förändrats. Även om $procs innehåller samma faktiska process som $proc, är inte varje enskild egendom exakt densamma i båda fallen. Så-innehåller kan inte upptäcka matchen.
Läs mer om ” topp tio PowerShell-irritationer.”
vill du ställa en fråga om den här artikeln? Jag svarar på http://powershell.com/cs/forums/230.aspx!