Как отмечает @Ansgar в комментариях, вся идея определения ваших параметров заключается в получении проверки.Когда вы разделяете параметры для своей функции, вы заставляете передавать их в функцию.Поэтому, если данное свойство вашей хеш-таблицы не существует в качестве параметра, вы получите ошибку - точно так же, как и предполагалось.
То, что вы можете сделать, входит в PSCustomObjectи использовать трубу.Если вы установите все свои параметры для принятия значения из конвейера, используя имя свойства (ValueFromPipelineByPropertyName = $true
), тогда вы действительно сможете получить желаемое поведение.
Сначала я переопределяю ваши различные функции, чтобы получить ValueFromPipelineByPropertyName = $true
атрибут атрибута настроен.
function Process-Something{
param(
[Parameter(ValueFromPipelineByPropertyName = $true)]
[string]$Owner
)
$PSBoundParameters
}
function Process-SomethingElse{
param(
[Parameter(ValueFromPipelineByPropertyName = $true)]
[string]$Owner,
[Parameter(ValueFromPipelineByPropertyName = $true)]
[int]$x,
[Parameter(ValueFromPipelineByPropertyName = $true)]
[int]$y
)
$PSBoundParameters
}
С этим я могу создать хеш-таблицу, как в вашем примере, преобразовать ее в PSCustomObject, и теперь я могу передать этот новый объект различным методам.и пусть они подберут только те свойства, которые им нужны.
Я включил PSBoundParameters
, чтобы продемонстрировать, что они получают то, что ожидают.Тестирование выполняется так:
$config = @{
"Owner" = "Bart Simpson"
"X" = 10
"Y" = 20
}
$psConfig = [PSCustomObject]$config
$psConfig | Process-Something
$psConfig | Process-SomethingElse
![enter image description here](https://i.stack.imgur.com/AfQVo.png)