Když lidé zkoumají operátoři k dispozici v PowerShell (pomoc about_comparison_operators), budou často narazit na dva podobné-zdánlivě, ale drasticky jiná, operátorů – a zmást je.
budu často vidět někoho, zkuste toto:
if ($string -contains '*win*') { }
snaží se zjistit, jestli $string obsahuje písmena „vyhrát“, ale bohužel to není to, co obsahuje. To, co opravdu chtějí použít, je-jako operátor:
Pokud ($string-like ‚ * win*‘) { }
vím, že to nečte tak pěkně, když to řeknete nahlas. Zní to trochu Údolní dívka, předpokládám. „Pokud je tato proměnná jako, víte, zástupný znak, omigod, jako opravdu?“Ale-jako je správný operátor pro tento úkol.
operátor-contains je o něco složitější. Je navržen tak, aby vám říct, zda sbírka objektů obsahuje („obsahuje“) určitý objekt. Nyní, pokud je vaše sbírka objektů banda řetězců, je to docela jednoduché.
$coll = "one','two','three','four'if ($coll -contains 'one') { }
je těžší, když kolekce obsahuje složité objekty. To nebude fungovat, jak byste si mohli myslet:
$sb = Get-Service
if ($sb -obsahuje ‚KOUSKY‘) { }
proměnná $sb neobsahuje řetězec „BITY;“ to, co obsahuje, je objekt služeb, jejichž Jméno je majetek BITŮ. Nemůžete opravdu použít-obsahuje tímto způsobem, protože porovnává celý objekt. Příklad:
# Get všechny procesy
$procs = Get-Process
# Získat jen jeden proces,
$proc = Get-Process | Select-první 1
# Zkontrolovat
$procs -obsahuje $proc
Tento bude téměř vždy Falešné. Je to proto, že v době potřebné ke spuštění druhého příkazu se první proces změnil. Jeho paměť, CPU nebo nějaká jiná hodnota se změnila. Ačkoli $procs obsahuje stejný skutečný proces jako $proc, ne každá vlastnost je v obou případech úplně stejná. Takže-obsahuje nemůže detekovat shodu.
Další informace o “ Top Ten PowerShell Annoyances.“
Chcete se zeptat na tento článek? Odpovím na http://powershell.com/cs/forums/230.aspx!