3

У меня есть следующая функция. Он генерирует строку в соответствии с переданными параметрами.Получить все параметры, переданные функции в 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 или hashamp), мой план заключается в том, чтобы использовать это для динамического создания returnstring.

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

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

ответ

7

$PSBoundParameters variable является Хеш, который содержит только параметры явно переданные функции.

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

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

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

Я хотел бы также добавить, что если вы планируете передать премного большое количество параметров функции, я чувствую, что положить все эти параметры в объект или данные структура и прохождение, что обычно является лучшей идеей. – EBGreen

+1

@ EBGreen Я нахожусь на заборе об этом, когда дело доходит до powershell. Я думаю, что это сильно зависит от ситуации. С отдельными параметрами вы можете позволить powershell выполнять проверку типов, валидацию, использование наборов параметров и т. Д. Поскольку мы не можем создавать классы (до версии 5), я думаю, что раздельные часто лучше, но не всегда. По крайней мере, у нас есть функция splatting для более удобного вызова функций с большим количеством параметров. – briantist

+0

Верно, что вы не можете писать реальные классы, но вы можете создавать объекты с помощью методов и свойств, которые позволят вам делать практически все, что вы сделали бы с экземпляром класса. – EBGreen

Смежные вопросы