Розглянемо наступний скрипт Powershell, який здійснює пошук папок у C: \ з позначкою 'og':
PS C: \> (ls |% {$ _. Ім'я} |? {$ _. Містить ("og")}) PerfLogs Програмні файли setup.log
Тепер я звужую пошук, щоб отримати лише один предмет:
PS C: \> (ls |% {$ _. Ім'я} |? {$ _. Містить ("Прог")}) Програмні файли
Дивна річ у тому, що перша операція дає масив , тоді як друга операція (яка є ІМХО семантично однаковою операцією, тому вона повинна давати однотипний результат) дає рядок . Це можна побачити в наступному результаті:
PS C: \> (ls |% {$ _. Ім'я} |? {$ _. Містить ("og")}). 3 PS C: \> (ls |% {$ _. Ім'я} |? {$ _. Містить ("Прог")}). 13
Це може дуже дратувати, оскільки, мабуть, є менше папок, які відповідають 'og', ніж ті, що відповідають 'Prog'.
Очевидно, що PowerShell неявно «розв’язує» масив з одним предметом до одного об’єкта, і ми ніколи не отримуємо масив довжиною 1. Схоже, що кожного разу, коли мені хочеться підрахувати результати, що надходять по конвеєру, я повинен перевірити, чи я м мати справу з масивом чи ні.
Як я можу запобігти цьому? Як ти з цим справляється?
$_.Contains
, то%{,,$_.Name}
працює ...