Рассмотрим следующий скрипт Powershell, который ищет папки в C:\ с именем 'og':
PS C:\> (ls | %{$_.Name} | ?{$_.Contains("og")}) PerfLogs Program Files setup.log
Теперь я сужу поиск, чтобы получить только один элемент:
PS C:\> (ls | %{$_.Name} | ?{$_.Contains("Prog")}) Program Files
Странно то, что первая операция приводит к массиву, тогда как вторая операция (которая ИМХО семантически та же самая операция, поэтому она должна давать тот же тип результата) возвращает строку. Это можно увидеть в следующем результате:
PS C:\> (ls | %{$_.Name} | ?{$_.Contains("og")}).Length 3 PS C:\> (ls | %{$_.Name} | ?{$_.Contains("Prog")}).Length 13
Это может быть очень раздражающим, поскольку очевидно, что папок, которые соответствуют 'og', меньше, чем папок, которые соответствуют 'Prog'.
Очевидно, что PowerShell неявно «распаковывает» массив из одного элемента в один объект, и мы никогда не получаем массив длиной 1. Кажется, что каждый раз, когда я хочу подсчитать результаты, поступающие по конвейеру, я должен проверить, имею ли я дело с массивом или нет.
Как я могу предотвратить это? Как вы справляетесь с этим?