【问题标题】:How to pipe multiple parameters with PowerShell ValueFromPipelineByPropertyName如何使用 PowerShell ValueFromPipelineByPropertyName 传递多个参数
【发布时间】:2019-12-05 06:13:44
【问题描述】:

我有以下简单的 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

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

参数 1:你好

参数2:

但是第二行产生了输出:

Param1:System.Collections.Hashtable

参数2:

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

参数 1:你好

Param2:那里

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

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

【问题讨论】:

  • 第二个应该根本不行,但是ValueFromPipeline是贪婪的,占用了hashtable。

标签: powershell parameter-passing powershell-cmdlet


【解决方案1】:

您可以通过将自定义对象(而不是哈希表)传递给您的函数来做到这一点。示例:

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

【讨论】:

  • 我实际上是自己发现了这个,当我收到这个答案的通知时,我正在输入我自己的答案。谢谢!
【解决方案2】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2019-06-04
    • 1970-01-01
    • 2023-03-08
    • 2023-01-26
    相关资源
    最近更新 更多