Согласно комментарию Ли Дейли, у вас может быть только один параметр, принимающий входные данные из конвейера через «Значение» (для каждого типа значения, например, string, int и т. Д.).В настоящее время ваш код отправляет массив строковых значений, который затем обрабатывается по одному по конвейеру.
Если вы хотите отправить несколько значений вместе в конвейер, вы можете сделатьпоэтому, сделав эти значения свойствами пользовательского объекта, вы сможете принять их через конвейер, используя параметры ValueFromPipelineByPropertyName
.Это работает путем сопоставления любых свойств входного объекта, имя которого совпадает с именем входных параметров:
function Test-Pipeline {
[CmdletBinding ()]
Param(
[Parameter(ValueFromPipelineByPropertyName=$true)][String]$Name,
[Parameter(ValueFromPipelineByPropertyName=$true)][String]$Value
)
Write-Host "Name: $Name"
Write-Host "Value: $Value"
}
$MyObject = [pscustomobject]@{
Name = "MyName"
Value = "MyValue"
}
$MyObject | Test-Pipeline
Результат:
Name: MyName
Value: MyValue
Альтернативный, но схожий подход заключается в использовании ValueFromPipeline
принять входной объект, а затем получить значения свойств из этого объекта:
function Test-Pipeline {
[CmdletBinding ()]
Param(
[Parameter(ValueFromPipeline=$true)][Object]$InputObject
)
$Name = $InputObject.Name
$Value = $InputObject.Value
Write-Host "Name: $Name"
Write-Host "Value: $Value"
}
$MyObject = [pscustomobject]@{
Name = "MyName"
Value = "MyValue"
}
$MyObject | Test-Pipeline
Некоторые командлеты будут поддерживать оба этих подхода, поскольку PowerShell сначала попытается сопоставить по типу объекта, а затем вернется к сопоставлениюпо названию свойства.Вот подробное объяснение этого здесь, если вы хотите узнать больше: https://blogs.technet.microsoft.com/heyscriptingguy/2013/03/25/learn-about-using-powershell-value-binding-by-property-name/
Обратите внимание, что если вы собираетесь успешно работать со значениями через конвейер, вам также необходимо использовать блок Process { }
в вашемфункция, которая приводит к тому, что коллекции объектов обрабатываются по одному:
function Test-Pipeline {
[CmdletBinding ()]
Param(
[Parameter(ValueFromPipeline=$true)][Object]$InputObject
)
Process {
$Name = $InputObject.Name
$Value = $InputObject.Value
Write-Host "Name: $Name"
Write-Host "Value: $Value"
}
}
$MyObject = @(
[pscustomobject]@{
Name = "MyName"
Value = "MyValue"
}
[pscustomobject]@{
Name = "MySecondName"
Value = "MySecondValue"
}
)
$MyObject | Test-Pipeline
Без этого будет обрабатываться только последнее значение в коллекции объектов.