Простой ответ: удалите аргумент Mandatory
для атрибута Parameter
на $InputObject
, чтобы получить желаемую функциональность.У меня недостаточно знаний о том, как работает привязка параметров, чтобы объяснить , почему это работает.
function Test-PowerShell {
[CmdletBinding(DefaultParameterSetName = 'ID')]
param(
[Parameter(ParameterSetName = 'InputObject', ValueFromPipeline)]
[PSTypeName('MyType')]
$InputObject,
[Parameter(ParameterSetName = 'ID', Mandatory, ValueFromPipelineByPropertyName)]
[int]
$ID
)
process {
$PSBoundParameters
}
}
$o = [pscustomobject]@{
PSTypeName = 'MyType'
ID = 6
Name = 'Bob'
}
PS> $o | Test-PowerShell
Key Value
--- -----
InputObject MyType
PS> [pscustomobject]@{ID = 6} | Test-PowerShell
Key Value
--- -----
ID 6
Мысли и эксперименты приведены ниже.
Вот a способ решения вашей проблемы (определение вашего собственного типа):
Add-Type -TypeDefinition @'
public class MyType
{
public int ID { get; set; }
public string Name { get; set; }
}
'@
И тогда вы бы пометили свой параметр как [MyType]
, создавая такие объекты, как выбудет от [pscustomobject]
:
[MyType]@{ ID = 6; Name = 'Bob' }
Оглядываясь назад, этот метод не работает.То, с чем вы сталкиваетесь, это поведение DefaultParameterSet
.Я бы посоветовал изменить то, что вы принимаете за конвейерный ввод.Есть ли вариант использования для получения идентификатора в качестве входного конвейера по сравнению с пользователем, который просто использует Test-PowerShell -ID 5
или Test-PowerShell
и получает запрос на ввод идентификатора?
Вот предложение, которое может работать, как вы предполагаете из моего тестирования:
function Test-PowerShell {
[CmdletBinding(DefaultParameterSetName = 'ID')]
param(
[Parameter(ParameterSetName = 'InputObject', Mandatory = $true, ValueFromPipeline = $true)]
[PSTypeName('MyType')]
$InputObject,
[Parameter(ParameterSetName = 'ID', Mandatory = $true, ValueFromPipeline = $true)]
[int]
$ID
)
process {
$PSBoundParameters
}
}
Чтобы взять пример из существующего встроенного командлета, они не используют одно и то же имя или свойства объекта для нескольких параметров.В Get-ChildItem
и LiteralPath
, и Path
принимают входные данные конвейера, но LiteralPath
принимает их только через PropertyName LiteralPath
или PSPath
(с псевдонимом).Path
- это ByValue и PropertyName, но только как Path
.