【发布时间】:2019-02-28 22:17:19
【问题描述】:
我有一个可以接受两种管道数据的高级函数:
- PSTypeName 为“MyType”的自定义对象
- 任何具有 ID 属性的对象
这是我的功能:
function Test-PowerShell {
[CmdletBinding(DefaultParameterSetName = "ID")]
param (
[Parameter(
Mandatory = $true,
ParameterSetName = "InputObject",
ValueFromPipeline = $true
)]
[PSTypeName('MyType')]
$InputObject,
[Parameter(
Mandatory = $true,
ParameterSetName = 'ID',
ValueFromPipelineByPropertyName = $true
)]
[int]
$ID
)
process {
if ($InputObject) {
$objects = $InputObject
Write-Verbose 'InputObject binding'
}
else {
$objects = Get-MyType -ID $ID
Write-Verbose 'ID binding'
}
# Do something with $objects
}
}
我可以这样使用这个函数:
$obj = [PSCustomObject]@{
PSTypeName = 'MyType'
ID = 5
Name = 'Bob'
}
$obj | Test-PowerShell -Verbose
请注意,此对象同时满足上述两个条件:它是 MyType,并且具有 ID 属性。在这种情况下,PowerShell 始终绑定到 ID 属性。这在性能方面并不理想,因为管道对象被丢弃,我必须使用 ID 重新查询它。我的问题是这样的:
如果可能,我如何强制 PowerShell 将管道绑定到 $InputObject?
如果我将默认参数集更改为 InputObject,PowerShell 将绑定到 $InputObject。但是,我不希望这样,因为当不带参数运行时,我希望 PowerShell 提示输入 ID,而不是 InputObject。
【问题讨论】:
标签: powershell parameters typing