我有一个函数创建一个属性名称为“事件编号”的对象:
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 定义的那样。
我发现可以通过使用[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