按名称将管道输入发送到不匹配的属性名称

Mar*_*agg 3 powershell

我有一个函数创建一个属性名称为“事件编号”的对象:

Function Get-ID {
    New-Object -TypeName PSObject -Property @{'Incident Number' = 'INC12345'; 'Other Stuff' = 'Blah'}
}
Run Code Online (Sandbox Code Playgroud)

我想通过管道将该“事件编号”值发送到另一个函数,但在第二个函数中,输入属性被命名为“ID”:

Function Get-Note {
    Param(
        [Parameter(ValueFromPipeline)]
        [string]$ID
    )
    Write-Output "The input was $ID"
}
Run Code Online (Sandbox Code Playgroud)

虽然变量名可以带有空格(例如${Incident Number}),但这使得在命令行中用作参数变得很尴尬。

根据上面的定义,输出为:

输入是@{Other Stuff=Blah; 事件编号=INC12345}

使用[Parameter(ValueFromPipelineByPropertyName)]返回值:

Get-Note :输入对象无法绑定到命令的任何参数,因为该命令不采用管道输入,或者输入及其属性与采用管道输入的任何参数都不匹配。

仅供参考 - 上面是一个例子。实际上,第一个函数创建的对象的属性是由 API 调用确定的。虽然我可以将这些属性重命名为该函数的一部分,但我更喜欢将它们保留为 API 定义的那样。

Mar*_*agg 5

我发现可以通过使用[Alias()]参数属性来做到这一点:

Function Get-ID {
    New-Object -TypeName PSObject -Property @{'Incident Number' = 'INC12345'; 'Other Stuff' = 'Blah'}
}

Function Get-Note {
    Param(
        [Parameter(ValueFromPipelineByPropertyName=$true)]
        [Alias('Incident Number')]
        [string]$ID
    )
    Write-Output "The input was $ID"
}
Run Code Online (Sandbox Code Playgroud)

输出:

PS > 获取 ID | 获取笔记

输入为 INC12345