【问题标题】:How to pipe parameters to PowerShell Advanced Function?如何将参数传递给 PowerShell 高级函数?
【发布时间】:2016-09-21 17:36:29
【问题描述】:

我在高级函数 (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] 但参数语法不允许这样做。

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

【问题讨论】:

标签: function powershell


【解决方案1】:

我想答案取决于你的最终目标。似乎您想要实现的只是使用哈希表中的键/值组合作为两个参数的值。如果是这种情况,我建议使用不同的管道绑定: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绑定的真棒特性:你可以将脚本块传递给这样的参数,其行为与@987654324中使用的类似@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 }

您在那里设置的任何验证器都应该按预期工作。

【讨论】:

  • 这工作:$ht.GetEnumerator() | AdvFunction -NamedParam1 { $_.Key } -NamedParam2 { $_.Value } thx!
  • @JaquelineVanek 因为那会做一些完全不同的事情。当哈希表键与参数匹配时(因此键仅用于匹配参数和参数),喷溅很有用,并且需要多个哈希表才能获得多个结果。这里键和值都用作函数的参数,一个哈希表可以根据需要产生尽可能多的结果。
猜你喜欢
  • 2023-03-26
  • 2017-07-11
  • 2022-10-07
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多