PowerShell: как к grep команда производится?

Я склонен делать это со своим собственным набором, если я хочу экранировать доступ к фактическому списку. Когда Вы пишете бизнес-объекты, шанс состоит в том, что Вам нужен рычаг, чтобы знать, добавляется ли Ваш объект/удаляется, в таком смысле я думаю, что BOCollection является лучшей идеей. Из того, потому что если это не требуется, Список более легок. Также Вы могли бы хотеть проверить использование IList для обеспечения дополнительного интерфейса абстракции, если Вам нужно некоторое проксирование (например, поддельный набор инициировал ленивую загрузку из базы данных)

, Но... почему бы не рассмотреть замок ActiveRecord или кто-либо другой назревает платформа ORM?:)

51
задан Peter Mortensen 10 January 2010 в 08:52
поделиться

3 ответа

Есть две проблемы. Как и в вопросе, select-string должна работать с выходной строкой, которую можно получить из "out-string". Кроме того, select-string не работает линейно со строками, которые к нему передаются. Вот общее решение

(alias|out-string) -split "`n" | select-string Write 
13
ответ дан 7 November 2019 в 09:51
поделиться

Ваша проблема в том, что псевдоним испускает поток объектов AliasInfo, а не поток струн. Это делает то, что я думаю, вы хотите.

alias | out-string -stream | select-string Alias

или как функция

function grep {
  $input | out-string -stream | select-string $args
}

alias | grep Alias

Когда вы не обрабатываете вещи, которые находятся в стадии разработки. (например, когда вы только что запустили alias), оболочка знает, что нужно использовать метод ToString () для каждого объекта (или используйте форматы вывода, указанные в информации ETS).

35
ответ дан 7 November 2019 в 09:51
поделиться

Если вы действительно хотите использовать "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*'}
31
ответ дан 7 November 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: