繁体   English   中英

如何通过管道将参数传递给PowerShell高级功能?

[英]How to pipe parameters to PowerShell Advanced Function?

我在高级功能(PowerShell v4)中使用参数验证:

Function Test-It {
[cmdletbinding(DefaultParameterSetName='set1')]
Param (
    [Parameter(ParameterSetName='set1',Position=0,Mandatory=$true,ValueFromPipeline=$true)]
    [ValidatePattern("regex1")][string]$param1,
    [Parameter(ParameterSetName='set1',Position=1,Mandatory=$true,ValueFromPipeline=$true)]
    [ValidatePattern("regex2")][string]$param2
)

我想通过哈希表将param1和param2传递给Test-It函数:

$ht.GetEnumerator() | % { $_.Name, $_.Value } | TestIt

问题是每个名称/值对都作为一个参数而不是位置1,位置2的两个参数传递。我尝试使用$ args [n],但参数语法不允许这样做。

如何将键值对作为两个不同的参数传递给高级功能?

我猜答案取决于您的最终目标。 似乎您想要实现的就是将哈希表中键/值的组合用作两个参数的值。 如果是这种情况,那么我建议您使用其他管道绑定: ByPropertyName 这需要管道对象,并寻找与参数名称匹配的属性(也可以是参数别名)。 如果参数名称不重要,则可以使它变得简单:

function Test-Hash {
    param (
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [String]$Key,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [String]$Value
    )
    process {
        "Key = $Key, Value = $Value"
    }
}

@{
    a = 1
    b = 2
}.GetEnumerator() | Test-Hash

如果参数名称不同,则可以定义别名,或使用ByPropertyName绑定的强大功能:可以将脚本块传递给此类参数,其行为与ForEach-Object cmdlet中使用的行为类似:

function Test-AwesomeHash {
    param (
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [String]$First,

        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [String]$Second
    )
    process {
        "First = $First, Second = $Second"
    }
}

@{
    a = 1
    b = 2
}.GetEnumerator() | Test-AwesomeHash -First { $_.Key } -Second { $_.Value }

您在此处设置的所有验证器都应按预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM