Получение разных результатов с использованием конвейера с функциями - PullRequest
7 голосов
/ 01 марта 2012

Я обнаружил, что передача объектов в функции через конвейер PowerShell преобразует их в string объекты.Если я передаю объект в качестве параметра, он сохраняет свой тип.Для демонстрации:

У меня есть следующая функция PowerShell, которая отображает тип и значение объекта:

function TestFunction {
    param (
        [Parameter(
            Position=0,
            Mandatory=$true,
            ValueFromPipeline=$true
        )] $InputObject
    )

    Echo $InputObject.GetType().Name
    Echo $InputObject
}

Я запустил этот скрипт для проверки функции:

[string[]] $Array = "Value 1", "Value 2"

# Result outside of function.
Echo $Array.GetType().Name
Echo $Array
Echo ""

# Calling function with parameter.
TestFunction $Array
Echo ""

# Calling function with pipeline.
$Array | TestFunction

Это приводит к выводу:

String[]
Value 1
Value 2

String[]
Value 1
Value 2

String
Value 2

РЕДАКТИРОВАТЬ: Как я могу использовать конвейер для передачи всего массива в функцию?

Ответы [ 3 ]

7 голосов
/ 01 марта 2012

Для обработки нескольких элементов, полученных через конвейер, в вашей функции необходим блок процесса:

function Test-Function {
    param (
        [Parameter(ValueFromPipeline=$true)] $Test
    )

    process {
        $Test.GetType().FullName
        $Test
    }
}

[string[]] $Array = "Value 1", "Value 2"
$Array | Test-Function

Дополнительная информация:

3 голосов
/ 02 марта 2012

В дополнение к наличию блока процесса вам также необходимо обрабатывать каждый элемент в массиве.Это необходимо, когда массив передается в качестве аргумента, а не по трубопроводу.Обратите внимание:

function Test-Function 
{
    param (
        [Parameter(
            Position=0,
            Mandatory=$true,
            ValueFromPipeline=$true
        )] $InputObject
    )

    process
    {
        $InputObject.GetType().Name
    }
}

$Array = "Value 1","Value 2"
Test-Function $array

Результатом будет String [], что, вероятно, не то, что вы хотите.Следующая команда напечатает тип каждого элемента в массиве независимо от того, как передается аргумент:

function Test-Function 
{
    param (
        [Parameter(
            Position=0,
            Mandatory=$true,
            ValueFromPipeline=$true
        )] $InputObject
    )

    process
    {
        foreach($i in $InputObject)
        {
            $i.GetType().Name
        }
    }
}
0 голосов
/ 01 марта 2012

Вы пытались передать что-то, что не является строкой, в эту функцию?

Попробуйте: 1, 2 | TestFunction

EDIT:

Попробуй это. Единственное изменение, которое я сделал, - добавление блока process вокруг $ InputObject

function TestFunction {
    param (
        [Parameter(
            Position=0,
            Mandatory=$true,
            ValueFromPipeline=$true
        )] $InputObject
    )

    process
    {
    Echo $InputObject.GetType().Name
    Echo $InputObject
    }
}
...