Параметры со значением по умолчанию не в PsBoundParameters?

Общий код

Рассмотрите этот код:

PS> function Test { param($p='default value') $PsBoundParameters }
PS> Test 'some value'
Key                                                               Value
---                                                               -----
p                                                                 some value
PS> Test
# nothing

Я ожидал бы это $PsBoundParameters содержал бы запись для $p переменная на обоих случаях. То корректное поведение?

Вопрос

Я хотел бы использовать splatting, который будет работать как это на большое количество функций:

function SomeFuncWithManyRequiredParams {
  param(
    [Parameter(Mandatory=$true)][string]$p1,
    [Parameter(Mandatory=$true)][string]$p2,
    [Parameter(Mandatory=$true)][string]$p3,
  ...other parameters
  )
  ...
}
function SimplifiedFuncWithDefaultValues {
  param(
    [Parameter(Mandatory=$false)][string]$p1='default for p1',
    [Parameter(Mandatory=$false)][string]$p2='default for p2',
    [Parameter(Mandatory=$false)][string]$p3='default for p3',
  ...other parameters
  )
  SomeFuncWithManyRequiredParams @PsBoundParameters
}

Я не хочу называть SomeFuncWithManyRequiredParams со всеми параметрическими усилителями перечисленным:

  SomeFuncWithManyRequiredParams -p1 $p1 -p2 $p2 -p3 $p3 ...

Действительно ли это возможно?

9
задан stej 11 May 2010 в 16:46
поделиться

1 ответ

Это зависит от того, как вы определяете «bound», я думаю, т.е. является ли значение привязанным к значению, предоставленному пользователем, или значением по умолчанию, предоставленным функцией? Честно говоря, меня не удивляет, что он ведет себя так, как он это делает, поскольку я рассматриваю «связанный» как означающий первое - связанное из пользовательского ввода. В любом случае, вы можете решить эту проблему, исправив переменную $PSBoundParameters, например:

function SimplifiedFuncWithDefaultValues { 
  param( 
    [Parameter(Mandatory=$false)][string]$p1='default for p1', 
    [Parameter(Mandatory=$false)][string]$p2='default for p2', 
    [Parameter(Mandatory=$false)][string]$p3='default for p3', 
  ...other parameters 
  ) 
  if (!$PSBoundParameters.ContainsKey(p1))
  {
    $PSBoundParameters.p1 = 'default for p1'
  }
  # rinse and repeat for other default parameters.
  SomeFuncWithManyRequiredParams @PSBoundParameters 
} 
5
ответ дан 4 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: