Общий код
Рассмотрите этот код:
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 ...
Действительно ли это возможно?
Это зависит от того, как вы определяете «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
}