Получить все параметры, переданные функции в PowerShell


У меня есть следующая функция. Он генерирует строку в соответствии с переданными параметрами.

function createSentenceAccordingly {
Param([Parameter(mandatory = $false)] [String] $name,
      [Parameter(mandatory = $false)] [String] $address,
      [Parameter(mandatory = $false)] [String] $zipcode,
      [Parameter(mandatory = $false)] [String] $city,
      [Parameter(mandatory = $false)] [String] $state)

    $stringRequired = "Hi,"

    if($name){
        $stringRequired += "$name, "
    }
    if($address){
        $stringRequired += "You live at $address, "
    }
    if($zipcode){
        $stringRequired += "in the zipcode:$zipcode, "
    }
    if($name){
        $stringRequired += "in the city:$city, "
    }
    if($name){
        $stringRequired += "in the state: $state."
    }

    return $stringRequired
}

Таким образом, в основном функция возвращает что-то в зависимости от передаваемых параметров. Я хотел избежать циклов if как можно больше и получить доступ ко всем параметрам сразу.

Могу ли я получить доступ ко всем параметрам в массиве или хэш-карте ? Поскольку я должен использовать именованные параметры, $args не может быть использован здесь. Если бы я мог получить доступ ко всем параметрам сразу (может быть, в массиве типа $args или хэш-метка), мой план состоит в том, чтобы использовать его для динамического создания строки возврата.

В будущем параметры функции будут значительно увеличиваться, и я не хочу продолжать писать циклы if для каждого дополнительного параметра.

Заранее спасибо, :)

1   3   2015-04-23 21:19:46

1 ответ:

$PSBoundParameters переменная - это хэш-таблица, содержащая только параметры, явно переданные функции.

Лучшим способом для того, что вы хотите, может быть использованиенаборов параметров , чтобы вы могли назвать определенные комбинации параметров (не забудьте сделать соответствующие параметры обязательными в этих наборах).

Тогда вы можете сделать что-то вроде:

switch ($PsCmdlet.ParameterSetName) {
    'NameOnly' {
        # Do Stuff
    }
    'NameAndZip' {
        # Do Stuff
    }
    # etc.
}