如何使用 PowerShell ValueFromPipelineByPropertyName 传递多个参数

How to pipe multiple parameters with PowerShell ValueFromPipelineByPropertyName

我有以下简单的 PowerShell 函数:

function ValueFromPipelineTest
{
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string] $Param1,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string] $Param2
    )

    Process
    {
        Write-Output "Param1: $Param1"
        Write-Output "Param2: $Param2"
    }
}

如果我像这样将值输入其中:

'Hello' | ValueFromPipelineTest
@{ Param1 = 'Hello'; Param2 = 'there' } | ValueFromPipelineTest

第一行按预期工作,产生输出:

Param1: Hello

Param2:

但是第二行产生输出:

Param1: System.Collections.Hashtable

Param2:

我实际上希望第二行产生输出:

Param1: Hello

Param2: there

我认为这是可能的,但我只是遗漏了一些东西。如果有一种不使用 hashtable 的方法,我对此持开放态度。我只是在寻找一种简单的方法来定义具有某些属性的对象并将其通过管道传递到我的函数中。

关于如何实现我所追求的目标有什么想法吗?提前致谢!

您可以使用 Splatting 但这不适用于管道。

$Params = @{
    'Param1' = “Hello”
    'Param2' = “There”
}
ValueFromPipelineTest @Params

或者,尝试以下方法。

$Params = @{
    Param1 = “Hello”
    Param2 = “There”
}


function ValueFromPipelineTest
{
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$Param
    )

    Process
    {
        Write-Output "Param1: $($Param["Param1"])"
        Write-Output "Param2: $($Param["Param2"])"
    }
}

$Params | ValueFromPipelineTest

您可以通过将自定义对象(而不是哈希表)传递给您的函数来完成此操作。示例:

function Test-Pipeline {
  param(
    [Parameter(ValueFromPipeline = $true,ValueFromPipelineByPropertyName = $true)]
    [String] $Param1,

    [Parameter(ValueFromPipelineByPropertyName = $true)]
    [String] $Param2
  )
  process {
    "Param1: $Param1"
    "Param2: $Param2"
  }
}

$obj = [PSCustomObject] @{Param1 = "Hello";Param2 = "World"}

$obj | Test-Pipeline

# Output:
#
# Param1: Hello
# Param2: World