Я склонен делать это со своим собственным набором, если я хочу экранировать доступ к фактическому списку. Когда Вы пишете бизнес-объекты, шанс состоит в том, что Вам нужен рычаг, чтобы знать, добавляется ли Ваш объект/удаляется, в таком смысле я думаю, что BOCollection является лучшей идеей. Из того, потому что если это не требуется, Список более легок. Также Вы могли бы хотеть проверить использование IList для обеспечения дополнительного интерфейса абстракции, если Вам нужно некоторое проксирование (например, поддельный набор инициировал ленивую загрузку из базы данных)
, Но... почему бы не рассмотреть замок ActiveRecord или кто-либо другой назревает платформа ORM?:)
Есть две проблемы. Как и в вопросе, select-string должна работать с выходной строкой, которую можно получить из "out-string". Кроме того, select-string не работает линейно со строками, которые к нему передаются. Вот общее решение
(alias|out-string) -split "`n" | select-string Write
Ваша проблема в том, что псевдоним испускает поток объектов AliasInfo, а не поток струн. Это делает то, что я думаю, вы хотите.
alias | out-string -stream | select-string Alias
или как функция
function grep {
$input | out-string -stream | select-string $args
}
alias | grep Alias
Когда вы не обрабатываете вещи, которые находятся в стадии разработки. (например, когда вы только что запустили alias), оболочка знает, что нужно использовать метод ToString () для каждого объекта (или используйте форматы вывода, указанные в информации ETS).
Если вы действительно хотите использовать "grep" для форматированного вывода (отображаемых строк), воспользуйтесь подходом Майка. Определенно есть моменты, когда это пригодится. Однако, если вы хотите попробовать понять природу конвейера объектов PowerShell, попробуйте это. Сначала проверьте свойства объектов, перемещающихся по конвейеру:
PS> alias | Get-Member
TypeName: System.Management.Automation.AliasInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
<snip>
*Definition* Property System.String Definition {get;}
<snip>
Обратите внимание на свойство Definition, которое представляет собой заголовок, который вы видите при отображении вывода Get-Alias (псевдоним), например:
PS> alias
CommandType Name *Definition*
----------- ---- ----------
Alias % ForEach-Object
<snip>
Обычно заголовок заголовка соответствует название свойства, но не всегда. Вот здесь и пригодится Get-Member. Он показывает вам, против чего вам нужно «создать сценарий». Теперь, если то, что вы хотите «grep» - это содержимое свойства Definition, подумайте об этом. Вместо того, чтобы просто использовать одно значение этого свойства, вы можете вместо этого фильтровать каждый объект AliasInfo в конвейере по содержимому этого свойства, и вы можете использовать для этого регулярное выражение, например:
PS> alias | Where-Object {$_.Definition -match 'alias'}
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
В этом примере я использую командлет Where-Object для фильтровать объекты на основе произвольного скрипта. В этом случае я фильтрую по свойству определения, совпадающему с псевдонимом регулярного выражения. Только те объекты, которые возвращают истину для этого фильтра, могут распространяться по конвейеру и форматироваться для отображения на хосте.
Кстати, если вы это набираете, вы можете использовать один из двух псевдонимов для Where-Object - «Где» или «?». Например:
PS> gal | ?{$_.Definition -match '-Item*'}