首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过管道将参数传递给PowerShell高级函数?

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

Stack Overflow用户
提问于 2016-09-22 01:36:30
回答 1查看 792关注 0票数 0

我在高级函数(PowerShell V4)中使用参数验证:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
$ht.GetEnumerator() | % { $_.Name, $_.Value } | TestIt

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-22 03:27:23

我想答案取决于你的最终目标。看起来你想要实现的就是使用哈希表中的键/值的组合作为两个参数的值。如果是这样,那么我建议使用不同的管道绑定:ByPropertyName。这个函数接受管道对象,并查找与参数名匹配的属性(也可以是参数别名)。如果参数的名称并不重要,您可以将其简化为:

代码语言:javascript
复制
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中使用的类似:

代码语言:javascript
复制
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 }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39623087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档