Получение разных результатов с помощью конвейера с функциями

Я обнаружил, что передача объектов функциям через конвейер 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

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


person Hand-E-Food    schedule 01.03.2012    source источник


Ответы (3)


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

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

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

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

Больше информации:

person Andy Arismendi    schedule 01.03.2012
comment
Красивый! Это заставило его работать. Спасибо! И в следующий раз я буду RTFM. :-) - person Hand-E-Food; 01.03.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
        }
    }
}
person Shay Levy    schedule 02.03.2012
comment
Как насчет массива хеш-таблиц? У меня уже есть блок Process, и массив все еще развернут на конвейере. Ничего себе, я разобрался. В этом примере это будет Test-Function ,$array - person Slogmeister Extraordinaire; 03.06.2016

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

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

РЕДАКТИРОВАТЬ:

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

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

    process
    {
    Echo $InputObject.GetType().Name
    Echo $InputObject
    }
}
person Cory    schedule 01.03.2012
comment
Это отображается как Int32[] для первых двух тестов и Int32 для последнего теста. Финальный тест по-прежнему отображает только последнее значение, а не весь массив. Я отредактировал вопрос, чтобы уточнить. - person Hand-E-Food; 01.03.2012