Оператор Spatsting Powershell только для принятых параметров? - PullRequest
0 голосов
/ 21 марта 2019

Можно ли с помощью PowerShell использовать разделение из хеш-таблицы, если в хеш-таблице содержится больше записей, которые принимает функция?

Мой вариант использования - иметь объекты конфигурации, которые я передаю от одной функции к другой. Однако для всех функций не требуются одинаковые параметры.

Ex:

function Process-Something{
    param(
        [Parameter()]
        [string]$Owner
    )


}

function Process-SomethingElse{
    param(
        [Parameter()]
        [string]$Owner,
        [Parameter()]
        [int]$x,
        [Parameter()]
        [int]$y

    )
}


$config = @{
    "Owner" = "Bart Simpson"
    "X" = 10
    "Y" = 20
}

Process-Something @config
Process-SomethingElse @config

Сбой с ошибкой:

Process-Something : Cannot find a matching parameter « Y ».

Идея состоит в том, чтобы не указывать отдельные свойства для каждой функции.

1 Ответ

2 голосов
/ 21 марта 2019

Как отмечает @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...