如何使用 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
我有以下简单的 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