2

Я изучаю PowerShell, поэтому много делаю такие вещи:

Get-Command | Out-String -Stream | ss child 

(ss - псевдоним для select-string).

Я устаю набирать Out-string -Stream все время, поэтому в Unix я бы просто создал для него псевдоним. Однако это не работает в Powershell.

  • Я создал его как псевдоним, и он допустил ошибку (кажется, я понимаю это).
  • Я создал его как функцию, но он проглотил весь мой вывод
  • Я создал его как фильтр, и это также не привело к выводу.

Как я могу это сделать?


Использование * child * в качестве аргумента, вероятно, является наилучшим способом выполнения этой конкретной задачи, но я действительно использую это в качестве примера, чтобы научиться писать функции PS.

Я просто хочу, чтобы функция заменила часть 'Out-string -Stream', чтобы вместо:

Get-Command | Out-String -Stream | ss child   

Я смогу написать:

Get-Command | oss | ss child 

Я предполагаю, что мне нужно использовать ValueFromPipeline или переменную ввода $, как показывает Мэтт.


Хорошо, я понял. Я думаю, мне нужно явно сказать, чтобы читать из конвейера. Вместо:

function oss { Out-String -Stream } 

Мне нужно сказать:

function oss { $input | Out-String -Stream } 

Интересно, как я пропустил это в документации?

2 ответа2

1

Что вы имеете в виду, что функция поглощает весь ваш вывод?

Я попробовал это и получить те же результаты:

function MySS {
    [cmdletbinding()]
    param (
        [string] $SearchString
    )
    Process {
        Get-Command | Out-String -Stream | Select-String -Pattern $SearchString
    }
}

Запуск Get-Member и GetType в выходных данных возвращает одинаковую форму функции и команды piped.

РЕДАКТИРОВАТЬ: Если вы хотите нам другие исходные функции

function MySS2 {
    [cmdletbinding()]
    param (
        [Parameter(
                    Mandatory = $True,
                    ValueFromPipeline = $true)]
        $input,
        [Parameter(
                    Mandatory = $True,
                    ValueFromPipeline = $false,
            Position = 0)]
        [string] $SearchString
    )
    Process {
        $input | Out-String -Stream | Select-String -Pattern $SearchString
    }
}

например

Get-Command | MySS2 "Get"
get-help get-alias | MySS2 "Get"

РЕДАКТИРОВАТЬ: простейшая форма (выделенная строка закомментирована):

function MyOSS {
    param ($input)
    $input | Out-String -Stream #| Select-String "Get"
}

РЕДАКТИРОВАТЬ: окончательное редактирование, я думаю! :-)

Я вижу, вы сами все поняли, Джонатан - рад, что помог, и я не знал, что вы можете использовать $ input, не объявив его как параметр. Это круто.

1

FWIW:

  • Я использовал эту функцию замены grep , ну, пока я использую PowerShell:

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

  • Текущие версии PowerShell (> = 3.0) имеют псевдоним для Select-String (sls) и функцию ярлыка для Out-String -Stream (oss). Get-Command также имеет свой псевдоним gcm . Таким образом, стандартной сокращенной формой для вашей команды является gcm | oss | sls child

  • Подстановочные знаки разрешены в параметре Get-Command name , что означает, что gcm *child* основном делает это (и, конечно, намного быстрее)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .